解析字节(C窗口)

解析字节(C窗口),c,windows,parsing,byte,C,Windows,Parsing,Byte,我有一个DWORD值,它在十六进制中可能看起来像: DWORD Val = 0xFF01091A 如何读取每个字节?我的意思是,我如何阅读FF,01,09和1A 谢谢 DWORD x1 = (0xFF01091A & 0xFF000000) >> 24; DWORD x2 = (0xFF01091A & 0x00FF0000) >> 16; DWORD x3 = (0xFF01091A & 0x0000FF00) >> 8; DWOR

我有一个DWORD值,它在十六进制中可能看起来像:

DWORD Val = 0xFF01091A
如何读取每个字节?我的意思是,我如何阅读FF,01,09和1A

谢谢

DWORD x1 = (0xFF01091A & 0xFF000000) >> 24;
DWORD x2 = (0xFF01091A & 0x00FF0000) >> 16;
DWORD x3 = (0xFF01091A & 0x0000FF00) >> 8;
DWORD x4 = (0xFF01091A & 0x000000FF) >> 0;
请记住,这将在字节放入内存时获取它们:在小端机器上
字节[0]
将保存最低有效字节,在大端机器上,它将保存最高有效字节


如果要按重要性获取字节,请按照中的建议使用移位。

AraK的方法。另一种方法是:

char x1 = *(((char*)&Val) + 0);
char x2 = *(((char*)&Val) + 1);
char x3 = *(((char*)&Val) + 2);
char x4 = *(((char*)&Val) + 3);

不过要小心,这种方式会对机器的末端非常敏感。

实际上它更像:

uint8_t Byte1 = (Val>> 0) & 0xFF;
uint8_t Byte2 = (Val>> 8) & 0xFF;
uint8_t Byte3 = (Val>>16) & 0xFF;
uint8_t Byte4 = (Val>>24) & 0xFF;
遮罩和移位(如前一个答案中所建议的)起作用;一个比较棘手的选择是“指针式双关”,即

等等——假设你在一台小小的endian机器上(如果你使用Windows,这很可能)。

使用union:

union Bytes {
    char c[4];
    unsigned int n;
};

int main() {
    Bytes b;
    b.n = 0xFF01091A;
    char c = b.c[2];
}

<> > >编辑:< /强>对不起,这是C++代码。我太累了,无法将其转换为C并进行测试,但你明白了吗?

这不会给出正确的结果;它将返回0xFF000000、0x00FF0000、0x0000FF00和0x000000FF。您还需要对值进行位移位,以便x1>>=24、x2>>=16和x3>>=8。您应该按24、16、8和0位进行L移位。注意这类事情,确保您了解字节的来源,以及代码是否可能移动到字节顺序可能不同的非windows平台(从一个大的到小的endian处理器)。很好,很简单,但是在小的endian和大的endian系统上有不同的行为。我不认为这是目的。@Thorarin:添加了关于endian的注释你的方式实际上更干净:)如果你分配给uint8\t,则不需要“&0xFF”,但是我认为它们可以让你更清楚地知道你在做什么,而且不会对性能造成影响,因为编译器应该足够聪明,能够发现它们是多余的,并且不会生成额外的汇编指令并且您应该将
main
声明为
intmain(void)
xlowbyte = (unsigned char*)(&Val) [0]; /* LSB, 0x1A */
xmidlowb = (unsigned char*)(&Val) [1]; /* 2nd-LSB, 0x09 */
union Bytes {
    char c[4];
    unsigned int n;
};

int main() {
    Bytes b;
    b.n = 0xFF01091A;
    char c = b.c[2];
}