little-endian java_将Little Endian转换为Big Endian

这篇博客讨论了如何在Little Endian和Big Endian之间转换32位数值的字节顺序。提供了解决方案,包括位移操作、内置函数(如__builtin_bswap32)以及使用联合体等方法,并强调了在性能关键场景下使用处理器优化的内置函数的重要性。
摘要由CSDN通过智能技术生成

回答(11)

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

OP的示例代码不正确 .

字节序转换在位和8位字节级工作 . 大多数字节序问题涉及字节级别 . OP代码在4位半字节级别进行字节序更改 . 推荐:

// Swap endian (big to little) or (little to big)

uint32_t num = 9;

uint32_t b0,b1,b2,b3;

uint32_t res;

b0 = (num & 0x000000ff) << 24u;

b1 = (num & 0x0000ff00) << 8u;

b2 = (num & 0x00ff0000) >> 8u;

b3 = (num & 0xff000000) >> 24u;

res = b0 | b1 | b2 | b3;

printf("%" PRIX32 "\n", res);

如果性能真的很重要,则需要知道特定的处理器 . 否则,将其留给编译器 .

[编辑] OP添加了一条改变事情的评论 .

"32bit numerical value represented by the hexadecimal representation (st uv wx yz) shall be recorded in a four-byte field as (st uv wx yz)."

在这种情况下,32位数字的字节序是未知的,结果需要以小端顺序存储在内存中 .

uint32_t num = 9;

uint8_t b[4];

b[0] = (uint8_t) (num >> 0u);

b[1] = (uint8_t) (num >> 8u);

b[2] = (uint8_t) (num >> 16u);

b[3] = (uint8_t) (num >> 24u);

[2016年编辑]简化

...结果的类型是提升的左操作数的类型....按位移位运算符C11§6.5.73

在移位常数(右操作数)之后使用 u 导致与没有它的情况相同 .

b3 = (num & 0xff000000) >> 24u;

b[3] = (uint8_t) (num >> 24u);

// same as

b3 = (num & 0xff000000) >> 24;

b[3] = (uint8_t) (num >> 24);

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

我想你可以使用函数 htonl() . 网络字节顺序是大端 .

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值