我正在尝试转换
的十六进制序列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
答案 0 :(得分:2)
你实际工作的是什么,但是你遇到了小端/大端问题。
十进制值701030803
实际上等于0x29c8e193
,即您所拥有的十六进制数,但顺序相反。
您拥有的字符为0x93
,0xe1
,0xc8
和0x29
,这可能是它们存储在内存中的方式,但在小端环境中,较高的内存地址是最重要的字节。
一个快速的修复方法是在将字节视为整数之前简单地交换字节,或者用以下内容自行构建:
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);