从char数组中转换一个short

ᴘᴀɴ*_*ᴛɪs 2 c casting

我在这里遇到了一个小问题.我有一个unsigned char数组,我试图访问字节2-3(0xFF0xFF)并将它们的值作为简短.

码:

 unsigned char Temp[512] = {0x00,0xFF,0xFF,0x00};
 short val = (short)*((unsigned char*)Temp+1)
Run Code Online (Sandbox Code Playgroud)

虽然我希望val包含0xFFFF它实际上包含0x00FF.我究竟做错了什么?

Jon*_*ler 7

short当数据未正确对齐时,无法保证您可以访问.

在某些机器上,尤其是RISC机器上,您会因未对齐的访问而出现总线错误和核心转储.在其他机器上,未对齐的访问将涉及到内核的陷阱以修复错误 - 这比核心转储快一点.

为了可靠地获得结果,你最好做转移和/或:

val = *(Temp+1) << 8 | *(Temp+2);
Run Code Online (Sandbox Code Playgroud)

要么:

val = *(Temp+2) << 8 | *(Temp+1);
Run Code Online (Sandbox Code Playgroud)

请注意,这明确提供了数据的big-endian(第一选项)或little-endian(第二)解释.

还要注意小心使用<<|; 如果您使用+而不是,则必须使用|shift表达式括号或使用乘法而不是shift:

val = (*(Temp+1) << 8) + *(Temp+2);
val = *(Temp+1) * 256 + *(Temp+2);
Run Code Online (Sandbox Code Playgroud)

合乎逻辑并使用逻辑或算术而不是混合.


Pub*_*bby 6

好吧,你取消引用一个unsigned char*什么时候你应该derefencing一个short*

我认为这应该有效:

 short val = *((short*)(Temp+1))
Run Code Online (Sandbox Code Playgroud)