2009-07-24 52 views
3

我有一个DWORD值,在十六进制可能看起来像:解析字节(C视窗)

DWORD Val = 0xFF01091A 

如何我读每一个字节?我的意思是,我怎么读FF,01,09和1A?

谢谢!

+1

要小心这种事情,确保你明白字节来自哪里,如果有代码可能移动到非Windows平台的字节顺序可能不同(从大到小排列处理器)。 – Tom 2009-07-24 20:11:16

回答

2
DWORD x1 = (0xFF01091A & 0xFF000000) >> 24; 
DWORD x2 = (0xFF01091A & 0x00FF0000) >> 16; 
DWORD x3 = (0xFF01091A & 0x0000FF00) >> 8; 
DWORD x4 = (0xFF01091A & 0x000000FF) >> 0; 
+0

直排老派! – 2009-07-24 20:04:48

+0

虽然不会给出正确的结果,它会返回0xFF000000,0x00FF0000,0x0000FF00和0x000000FF。您还需要对值进行位移,所以x1 >> = 24,x2 >> = 16,x3 >> = 8。 – JAB 2009-07-24 20:08:39

+0

您应该按24,16,8和0位移位。 – 2009-07-24 20:09:13

5
DWORD value; 
// casts to `char *` are always ok: 
unsigned char * bytes = (unsigned char *)&value; 
unsigned char third_byte = bytes[2]; 

请记住,这将得到字节它们被放置在内存:在小端机bytes[0]将举行至少显著字节,在大端机器,它会保持最重要的一个。

如果您想按字节获取字节,请按照Efraim's answer中的建议使用移位。

1

AraK的方式有效。你可以做的另一种方式是:

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

当心不过,这种方式将是机器的字节序敏感。

8

不是真的它更像是:

uint8_t Byte1 = (Val>> 0) & 0xFF; 
uint8_t Byte2 = (Val>> 8) & 0xFF; 
uint8_t Byte3 = (Val>>16) & 0xFF; 
uint8_t Byte4 = (Val>>24) & 0xFF; 
1

面具和转移(如在以前的答案建议)的作品;一个有些棘手的选择是“指针类型双关”,即

xlowbyte = (unsigned char*)(&Val) [0]; /* LSB, 0x1A */ 
xmidlowb = (unsigned char*)(&Val) [1]; /* 2nd-LSB, 0x09 */ 

等 - 假设你是一个小端机(如果你使用的是Windows这是有可能的)上。

2

使用工会:

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

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

编辑:对不起,这是C++代码。我太累了,不能将它转换成C并测试它,但你明白了吗?