【发布时间】:2012-10-14 07:29:18
【问题描述】:
我有一个struct,它由多个 32 位元素组成。我应用了#pragma pack (4),因此以下结构是线性且对齐的。
struct
{
int a; // 4 bytes
int b; // 4 bytes
int c; // 4 bytes
} mystruct; // total 16 bytes
如何交换这些元素中的每一个(小端 -> 大端)?
方法是void swap(void* a, int b);,a指向结构体,b整数给出结构体的大小。
例如:
void swap(void* a, int b)
{
//FIXME !
for (int i = 0; i < b; i+= 32)
{
a = (a & 0x0000FFFF) << 16 | (a & 0xFFFF0000) >> 16;
a = (a & 0x00FF00FF) << 8 | (a & 0xFF00FF00) >> 8;
a += 32;
}
}
【问题讨论】:
-
您的元素 d 不是四个字节,而是一个字节。通过使用
#pragma pack(4),您已强制编译器在元素 d 之后添加三个填充字节,但您的代码访问这些字节仍然是错误的。如果你真的想要四个字节,char d[4];有什么问题? -
@john 帖子已编辑,这不是我要找的。现在假设结构仅由 3 个 int 组成。
-
顺便说一句,您当前的编译指示可能已经过时,因为一个充满
ints 的结构至少与int的对齐对齐,这很可能至少有4 个字节。另一方面,我不明白你为什么假设结构与 16 个字节对齐(除非你认为#pragma pack考虑元素而不是字节,它当然不会)。 -
你的意思是字节交换而不是位交换。字节序改变是字节交换,而不是位。
-
@ChristianRau 结构中的
int不完整,我清理了示例以使其更易于理解。当“对齐”时,我的意思是结构的元素在内存中相互跟随
标签: c++ byte swap endianness