2009-08-13 57 views
0

這幾乎是我幾個星期前自己的問題的幾乎完全相同的副本。沒有數據類型可以保存完整數字時將十進制轉換爲十六進制

Convert Hex to Decimal when no datatype can hold the full number

這個時候,它是反向。我有號碼(在一個方便的空終止的字符串),我需要使這個數字的字節。但是,我正在爲微控制器構建32位體系結構,因此我沒有使用atoi的可能性,因爲數量大於32位。

有沒有人有關於如何扭轉在第一個鏈接中提供的算法的想法,以獲得原始結果?我的模數算術技巧讓我失望。

快速示例:155.207.231.1350X [24] [23] [12] [66] [9F](括號分開字節)

回答

1

你可以做一些類似於BigInt的事情。

a = atoi of lower 7 decimal digits 
b = atoi of remaining upper decimal digits 


for (int i = 0; i < 5; i++) 
{ 
    a += 10000000 * (b % 256); 
    b /= 256; 
    Result[i] = a % 256; 
    a /= 256; 
} 
+1

我不明白爲什麼a%32,當一個字節數組可以容納多達%256 – 2009-08-13 18:52:14

+0

你是對的,當我發佈時我顯然沒有足夠的咖啡因,修正:) – matthock 2009-08-13 21:05:39

+0

雖然想到了它,開始出現溢出問題。必須將其限制爲7個十進制數字以避免這種情況。 – matthock 2009-08-13 21:07:27

0

您需要彙編爲這一個。僞代碼:

int low = 0 // lower 32 bit 
int high = 0 // higher 32 bit 

for (int i=0; i<string.length(); i++) { 
    int digit = string.get(i) - '0'; 
    int a = low; 
    int b = high; 
    a <<= 1; b += overflow;    // *2 
    a <<= 1; b += overflow;    // *4 
    a += low; b += overflow; b += high; // *5 
    a <<= 1; b += overflow;    // *10 
    a += digit; b += overflow;   // +digit 
    low = a; high = b; 
} 

所以基本上,你創建一個使用兩個32位整數的64位寄存器。對於每一個循環,你:

value *= 10 + digit; 

之後,你只需要在產生價值的開始跳過0字節得到你所尋求的字節。

+0

我不明白「溢出」應該是什麼。 – 2009-08-13 15:44:23

+0

每個CPU都有一個溢出或進位位,當最後一個操作不適合涉及的數據類型時,該位置位。如果您有一個值爲0xff的字節,並且右移一次,則進位位將被置1(因爲最高位被設置)並且字節將爲0xfe。 – 2009-08-13 15:47:12

+0

通常,你有「ADDC」(加上carry),所以你可以「ROR a; AADC#0,b;」或者有一個分支:「ROR a; BCC#label; ADD#1,b; #label」,所以如果沒有設置進位位,跳過ADD。 – 2009-08-13 15:49:09

0

只需從左到右分析字符串,將前一個結果乘以10並添加數字即可。

下面是C#中的一些代碼來展示這個概念。前兩種方法對數學的陣列上:

static void Mul(byte[] data, int num) { 
    int n = 0; 
    for (int i = data.Length - 1; i >= 0; i--) { 
     n += (int)data[i] * num; 
     data[i] = (byte)n; 
     n >>= 8; 
    } 
} 

static void Add(byte[] data, int num) { 
    for (int i = data.Length - 1; num > 0; i--) { 
     num += (int)data[i]; 
     data[i] = (byte)num; 
     num >>= 8; 
    } 
} 

然後你只需要做:

string s = "155207231135"; 
byte[] result = new byte[16]; 
foreach (char c in s) { 
    Mul(result, 10); 
    Add(result, c - '0'); 
} 

結果是result陣列,補齊零個字節向左英寸

它不應該難以翻譯成C ... :)

相關問題