我有一个char数组,它实际上用作字节数组而不是用于存储文本。在数组中,有两个特定的字节表示我需要存储到unsigned int值的数值。下面的代码解释了设置。
char* bytes = bytes[2];
bytes[0] = 0x0C; // For the sake of this example, I'm
bytes[1] = 0x88; // assigning random values to the char array.
unsigned int val = ???; // This needs to be the actual numeric
// value of the two bytes in the char array.
// In other words, the value should equal 0x0C88;
我无法弄清楚如何做到这一点。我认为这将涉及一些铸造和重铸指针,但我不能让它工作。我怎样才能实现我的目标?
更新
感谢Martin B的快速回复,但这不起作用。具体来说,在我的情况下,两个字节是0x00
和0xbc
。显然我想要的是0x000000bc
。但是我在unsigned int中得到的是0xffffffbc
。
Martin发布的代码是我的实际原始代码,只要所有字节都小于128(.i.e。正的有符号字符值,就可以正常工作。)
答案 0 :(得分:16)
unsigned int val = (unsigned char)bytes[0] << CHAR_BIT | (unsigned char)bytes[1];
如果sizeof(unsigned int) >= 2 * sizeof(unsigned char)
(不是C标准保证的话)
现在......这里有趣的事情肯定是操作员的顺序(在很多年里我仍然只能记住+, -, * and /
...对我感到羞耻:-),所以我总是把尽可能多的括号)。 []
是王道。第二个是(cast)
。第三个是<<
,第四个是|
(如果您使用+
而不是|
,请记住+
比{{1}更重要所以你需要使用brakets)
我们无需向<<
这两个(unsigned integer)
转发,因为integral promotion会为我们做一个,而对于另一个它应该是自动的Arithmetic Conversion
如果你想减少头痛,我会补充一下:
(unsigned char)
答案 1 :(得分:4)
unsigned int val = (unsigned char) bytes[0]<<8 | (unsigned char) bytes[1];
答案 2 :(得分:1)
字节顺序取决于处理器的字节顺序。你可以这样做,这将适用于大型或小型端机。 (没有ntohs它将适用于big-endian):
unsigned int val = ntohs(*(uint16_t*)bytes)
答案 3 :(得分:0)
unsigned int val = bytes[0] << 8 + bytes[1];
答案 4 :(得分:0)
我认为这是一种更好的方法,而不是依赖指针别名:
union {unsigned asInt; char asChars[2];} conversion;
conversion.asInt = 0;
conversion.asChars[0] = 0x0C;
conversion.asChars[1] = 0x88;
unsigned val = conversion.asInt;