关于Char数组到无符号长的混淆

时间:2014-02-26 03:11:33

标签: c arrays char int

我正在尝试转换

的十六进制序列
0x93e1c829

2481047593

我的十六进制序列存储在无符号字符数组中,打印时看起来像0xf8, 0xff, 0x89, 0x6b

我用过

unsigned char number[4]; 
// populate the array
unsigned long expected_value = (unsigned long) (*((unsigned int*) number))

我很确定我错过了一些相当简单但却无法发现的东西。上面的逻辑告诉我:将char数组转换为整数数组,然后获取整数的值并将其转换为unsigned long。

但是,当我这样做时

printf("%lu", expected_value);

我得到了

701030803

参考:

使用

http://www.binaryhexconverter.com/hex-to-decimal-converter

我发现预期值为2481047593

2 个答案:

答案 0 :(得分:2)

你实际工作的是什么,但是你遇到了小端/大端问题。

十进制值701030803实际上等于0x29c8e193,即您所拥有的十六进制数,但顺序相反。

您拥有的字符为0x930xe10xc80x29,这可能是它们存储在内存中的方式,但在小端环境中,较高的内存地址是最重要的字节。

一个快速的修复方法是在将字节视为整数之前简单地交换字节,或者用以下内容自行构建:

unsigned long expected_value =
    number[3] << 24 ||
    number[2] << 16 ||
    number[1] <<  8 ||
    number[0];

如果您处于提供它们的环境(例如POSIX),则有一些功能可以帮助您完成此工作,例如htonl()(主机格式为网络格式,长型)。

答案 1 :(得分:1)

  

我的十六进制序列存储在无符号字符数组中,打印时看起来像0xf8, 0xff, 0x89, 0x6b

我不明白这些数字与给定的其他数字有什么关系......但是无论如何,@ paxdiablo是正确的,701030803是字节反转的等价物2481047593.你可以指定数字是相反的顺序,或者...如果你无法控制字节的顺序(比如,它们来自外部源,如输入文件),那么你将不得不手动反转字节,类似于以下内容:

unsigned char inp[4];
// program populates array inp[]
unsigned char reversed[4] = { inp[3], inp[2], inp[1], inp[0] };
unsigned long expected_value = (unsigned long) (reversed);