【问题标题】:How should I convert the endianness of a 14-bit bitfield?我应该如何转换 14 位位域的字节顺序?
【发布时间】:2013-04-06 20:23:25
【问题描述】:

如果我知道我在一个 little-endian 机器上,我如何转换 14 位位域的 endiannes?

struct {
    unsigned foo : 14, bar 2;
} baz;

我有一种预感,baz.foo = htons(baz.foo) 将无法正常工作。

【问题讨论】:

  • 没有单一的位域布局,因此没有从“小端位域”到“大端位域”的标准转换。如果您指定要转换的布局,也许您的问题是可以回答的,但就目前的形式而言,它不是。
  • 另请注意,“字节顺序”是指字节顺序,而不是位顺序。位不可寻址,因此即使您尝试,也无法在一个字节内观察它们是如何存储在内存中的。
  • @PascalCuoq 我在 x86 Linux 上使用 GCC。因此bar 的 2 位将被放置在结构的第一个字节的最高有效位。
  • bar 会在最低有效字节的最高有效位中吗?你确定吗?
  • 我的 GCC 使用完整的 32 位 ints 来存储位域。假设所有 GCC 都这样做,并且假设源布局和目标布局都类似于 GCC,那么您必须进行 32 位字节交换。

标签: c endianness bit-fields


【解决方案1】:

将其与 uint16_t 放在一个联合中,然后交换它。

【讨论】:

  • 但这将交换其他两位。
  • @Matt:位域不存在字节序。正如 Pascal 所说,字节序是字节顺序。
猜你喜欢
  • 2012-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-21
  • 1970-01-01
  • 2010-10-17
  • 1970-01-01
相关资源
最近更新 更多