我在这里遇到了一个小问题.我有一个unsigned char数组,我试图访问字节2-3(0xFF和0xFF)并将它们的值作为简短.
码:
unsigned char Temp[512] = {0x00,0xFF,0xFF,0x00};
short val = (short)*((unsigned char*)Temp+1)
Run Code Online (Sandbox Code Playgroud)
虽然我希望val包含0xFFFF它实际上包含0x00FF.我究竟做错了什么?
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)
合乎逻辑并使用逻辑或算术而不是混合.
好吧,你取消引用一个unsigned char*什么时候你应该derefencing一个short*
我认为这应该有效:
short val = *((short*)(Temp+1))
Run Code Online (Sandbox Code Playgroud)