2014-02-26 44 views
0

我想打印的样子0xf8, 0xff, 0x89, 0x6b时的混淆的字符数组为unsigned long

0x93e1c829 

十六进制序列转换为

2481047593 

我的十六进制序列存储在一个无符号字符数组

我用

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

我很确定我错过了一些相当简单的事情,但无法发现它。上面的逻辑对我说:将char数组转换为整数数组,然后取整数值并将其转换为无符号长整数。

然而,当我做

printf("%lu", expected_value); 

我得到

701030803 

参考:

使用

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

我发现是t他期望的价值是2481047593

回答

2

你实际上的工作,但你遇到的小端/ big-endian问题。

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

你的字符为0x930xe10xc80x29而这很可能他们是如何存储在内存中,但是,在小端的环境,更高的内存地址是最显著字节。

一个quick'n'dirty解决方法是把它当作一个整数之前简单地交换字节,并或自己喜欢的东西构造它:

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

如果你在为他们提供一个环境是(如POSIX),有功能可以为你做这项工作,比如htonl()(主机格式为网络格式,长类型)。

+0

Rather比快速和肮脏,是不是整个'网络字节顺序'功能套件? –

+0

@Peter,是的,但它们不是ISO C的一部分。但是,我也会提及它们。谢谢。 – paxdiablo

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);