java c 大小端转换_Java 大小端转换(基于ByteBuffer)

大小端的基础知识:

小端( little-endian):低位字节在前,高位字节在后。大端( Big-Endian),则反之。具体而言,就是为了说清楚,CPU架构1字(word)中byte的存储顺序。计算机内存中数据自然的顺序就是:低位先来,高位后到

JAVA中所有的二进制文件都是按大端存储,这种存储方式也被称为network order。即在所有的平台上,如Mac、 PC、 UNIX等等运行JAVA,都不用考虑大小端的问题。麻烦的是不同语言开发的程序进行数据交换,如笔者最近的项目,二进制文件是由C生成的,通过redis 消息通道以Json格式发过来,而C语言默认是小端模式。有些平台(如Mac、IBM 390)内置用的大端模式,有些平台内置用的小端模式 (如Intel)。JAVA帮你屏蔽了各平台字节顺序的差异。开心呀

例如,32位16进制的 0x45679812在内存中如下存储:

基于ByteBuffer(可通过Order来设置大端或者小端,默认为大端 —— Big-Endian),代码实现如下图(支持网络端口——2字节及4字节的int转换):

/*** 将小端bytes数据转化为大端数据

*

* 默认网络传输字节为大端,java 全部为大端(与平台无关)

* 关于 “Little-Endian and Big-Endian”,详情请参考:

*

*@parambytes

*@return转化后得到的整数

* @Linkhttps://howtodoinjava.com/java/basics/little-endian-and-big-endian-in-java/*

*/

private int bytesToBigEndian(byte[] bytes) {int result = 0;if (bytes == null || bytes.length < 0)return -1;

ByteBuffer buffer=ByteBuffer.wrap(bytes);

buffer.order(ByteOrder.BIG_ENDIAN);if (bytes.length ==RECORD_BYTES_SIZE) {

result=buffer.getInt();

}else if (bytes.length ==PORT_BYTES_SIZE) {//端口号:0 ~ 65535; Short: -32768 ~ 32767

short tmp =buffer.getShort();

result= tmp < 0 ?getUnsignedShort(tmp) : tmp;

}if (result < 0) {

logger.info("Length = " + result + " ; original data:" +bytes);

}returnresult;

}

附:

*****************************************************************************************************

精力有限,想法太多,专注做好一件事就行

我只是一个程序猿。5年内把代码写好,技术博客字字推敲,坚持零拷贝和原创

写博客的意义在于打磨文笔,训练逻辑条理性,加深对知识的系统性理解;如果恰好又对别人有点帮助,那真是一件令人开心的事

*****************************************************************************************************

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值