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

C 关于字符数组到无符号长字符的混淆,c,arrays,char,int,C,Arrays,Char,Int,我正在尝试转换 0x93e1c829 到 我的十六进制序列存储在一个无符号字符数组中,该数组在打印时看起来像0xf8、0xff、0x89、0x6b 我曾经 unsigned char number[4]; // populate the array unsigned long expected_value = (unsigned long) (*((unsigned int*) number)) 我相当确定我遗漏了一些相当简单的东西,但我无法发现它。上面的逻辑告诉我:将char数组转换为整

我正在尝试转换

0x93e1c829

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

我曾经

unsigned char number[4]; 
// populate the array
unsigned long expected_value = (unsigned long) (*((unsigned int*) number))
我相当确定我遗漏了一些相当简单的东西,但我无法发现它。上面的逻辑告诉我:将char数组转换为整数数组,然后获取整数的值并将其转换为无符号long

然而,当我

printf("%lu", expected_value);
我明白了

参考:

使用


我发现期望值是
2481047593

您实际使用的值,但是您遇到了小端/大端问题

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

您拥有的字符是
0x93
0xe1
0xc8
0x29
,这可能就是它们存储在内存中的方式,但在一个小的endian环境中,较高的内存地址是最重要的字节

一个快速的“n”脏修复方法是,在将字节作为整数处理之前,简单地交换字节,或者自己用如下方式构造它:

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

数字[3]你所拥有的实际上是有效的,但是你遇到了小端/大端问题

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

您拥有的字符是
0x93
0xe1
0xc8
0x29
,这可能就是它们存储在内存中的方式,但在一个小的endian环境中,较高的内存地址是最重要的字节

一个快速的“n”脏修复方法是,在将字节作为整数处理之前,简单地交换字节,或者自己用如下方式构造它:

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

数字[3]你所拥有的实际上是有效的,但是你遇到了小端/大端问题

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

您拥有的字符是
0x93
0xe1
0xc8
0x29
,这可能就是它们存储在内存中的方式,但在一个小的endian环境中,较高的内存地址是最重要的字节

一个快速的“n”脏修复方法是,在将字节作为整数处理之前,简单地交换字节,或者自己用如下方式构造它:

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

数字[3]你所拥有的实际上是有效的,但是你遇到了小端/大端问题

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

您拥有的字符是
0x93
0xe1
0xc8
0x29
,这可能就是它们存储在内存中的方式,但在一个小的endian环境中,较高的内存地址是最重要的字节

一个快速的“n”脏修复方法是,在将字节作为整数处理之前,简单地交换字节,或者自己用如下方式构造它:

unsigned long expected_value =
    number[3] << 24 ||
    number[2] << 16 ||
    number[1] <<  8 ||
    number[0];
unsigned long预期值=
编号[3]
我的十六进制序列存储在一个无符号字符数组中,该数组在打印时看起来像
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);
我的十六进制序列存储在一个无符号字符数组中,该数组在打印时看起来像
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);
我的十六进制序列存储在一个无符号字符数组中,该数组在打印时看起来像
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);
我的十六进制序列存储在一个无符号字符数组中,该数组在打印时看起来像
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);

这不是整个
网络字节顺序
函数集所做的,而不是快速和肮脏吗?@Peter,是的,但它们不是isoc的一部分。不过,我也要提到它们。谢谢。这不是整个
网络字节顺序
功能套件的功能吗