2012-09-19 65 views
1

我一直在努力開展從CString的包含十六進制字符串爲一個字節數組轉換,並已CString的十六進制數值轉換爲字節數組

成功爲止。我看過論壇,目前他們似乎沒有任何幫助。是否有一個功能,只有幾個

行代碼來做這種轉換?

我的代碼:

BYTE abyData[8]; // BYTE = unsigned char 

CString sByte = "0E00000000000400"; 

期待:

abyData[0] = 0x0E; 
abyData[6] = 0x04; // etc. 
+0

你的榜樣實際顯示包含字符串,這是不正確的... – Useless

回答

3

你可以簡單地吞噬兩個角色在同一時間:

unsigned int value(char c) 
{ 
    if (c >= '0' && c <= '9') { return c - '0'; } 
    if (c >= 'A' && c <= 'F') { return c - 'A' + 10; } 
    if (c >= 'a' && c <= 'f') { return c - 'a' + 10; } 

    return -1; // Error! 
} 

for (unsigned int i = 0; i != 8; ++i) 
{ 
    abyData[i] = value(sByte[2 * i]) * 16 + value(sByte[2 * i + 1]); 
} 

當然8應該是你的數組的大小,你應該確保該字符串正是兩倍長。檢查版本將確保每個字符都是有效的十六進制數字,並且如果不是這種情況,則表示出現某種類型的錯誤。

+0

使它工作的每個無符號的字符!感謝Kerrek! – Neophile

+0

@TheNewbie:好東西,我很高興! –

2

怎麼是這樣的:

for (int i = 0; i < sizeof(abyData) && (i * 2) < sByte.GetLength(); i++) 
{ 
    char ch1 = sByte[i * 2]; 
    char ch2 = sByte[i * 2 + 1]; 

    int value = 0; 

    if (std::isdigit(ch1)) 
     value += ch1 - '0'; 
    else 
     value += (std::tolower(ch1) - 'a') + 10; 

    // That was the four high bits, so make them that 
    value <<= 4; 

    if (std::isdigit(ch2)) 
     value += ch1 - '0'; 
    else 
     value += (std::tolower(ch1) - 'a') + 10; 

    abyData[i] = value; 
} 

注:上面的代碼是不測試

1

,你可以:

#include <stdint.h> 
#include <sstream> 
#include <iostream> 

int main() { 
    unsigned char result[8]; 
    std::stringstream ss; 
    ss << std::hex << "0E00000000000400"; 
    ss >> *(reinterpret_cast<uint64_t *>(result)); 
    std::cout << static_cast<int>(result[1]) << std::endl; 
} 

然而照顧內存管理問題! 加上其結果是相反的順序,你所期望的,因此:

result[0] = 0x00 
result[1] = 0x04 
... 
result[7] = 0x0E 
+0

爲什麼會有「內存管理問題」?爲什麼*不*你提到這個代碼是未定義的行爲? –

+0

這並不是真的有幫助,當試圖做我想要的。 – Neophile

+0

@Kerrek SB:如果轉換所需的字節數與結果[]的大小不匹配,則可能會出現內存管理問題。未定義的行爲在哪裏? – Sdra

相關問題