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的一部分。不过,我也要提到它们。谢谢。这不是整个网络字节顺序
功能套件的功能吗