2012-09-19 40 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

相关问题