【发布时间】:2019-11-16 10:00:17
【问题描述】:
我很难理解我是否以正确的方式执行此操作,以及这是否是(唯一)最佳解决方案。
我正在进行的项目是使用Three-Dimensional Array 来保存和使用大量数据。 “数据”的一部分是 DWORD 类型,我必须从/到 DWORD/BYTE 进行安全转换。
BYTE(c 风格)数组如下所示:
BYTE array_data[150][5][255] =
{
{
{ // bytes },
{ 0x74,0x21,0x54,0x00 }, // This is converted from DWORD like: 0x00542174
{ // bytes },
{ // bytes },
{ // bytes },
},
};
我发现从 DWORD 转换为 BYTE的(唯一)方法:
DWORD dword_data;
char byte_array[4];
*(DWORD*)byte_array = dword_data; // byte_array becomes {0x74, 0x21, 0x54, 0x00}
wchar_t temp[256];
wsprintfW(temp, L"{0x%02x,0x%02x,0x%02x,0x%02x}, // This is converted from DWORD like: 0x%.8X\n", (BYTE)byte_array[0], (BYTE)byte_array[1], (BYTE)byte_array[2], (BYTE)byte_array[3], (DWORD)dword_data);
据我了解,DWORD 是 4 BYTE,这就是字符最大长度为 4 的原因。(如果我错了,请纠正我?)
然后将 从 BYTE 转换回 DWORD(s):
//Convert an array of four bytes into a 32-bit integer.
DWORD getDwordFromBytes(BYTE* b)
{
return (b[0]) | (b[1] << 8) | (b[2] << 16) | (b[3] << 24);
};
printf("dword_data: 0x%.8X\n", getDwordFromBytes(array_data[0][1]));
打印效果很好:0x00542174。
所以我的问题是,这一切是否正确和安全?因为我会在数组中有很多数据,而 DWORD/BYTE 转换对我来说是必须的,它必须是准确的。
请指正并纠正我做错的地方,我将不胜感激!
【问题讨论】:
-
没关系,你可以忽略字节序并输入双关语。
-
感谢@HansPassant,所以不同的PC(不同版本的windows,不同的CPU)不会影响任何东西吗?在我的示例中,必须保留 0x00542174 的格式......这意味着我不能像 0x74124500 那样将其倒退。
-
非常感谢,发布一个答案,以便我接受它:)