zoukankan      html  css  js  c++  java
  • Java .Net Byte数组存储差异以及解决方法

    最近在Java与.Net服务Bytes数据交互碰到一个问题:.Net IntToBytes结果和Java IntToBytes结果是反序的,查了一下发现:Java stores things internally as Big Endian, while .NET is Little Endian by default.

    Big Endian:最高字节在地址最低位,最低字节在地址最高位,依次排列。
    Little Endian:最低字节在最低位,最高字节在最高位,反序排列。
          为什么要注意字节序的问题呢?你可能这么问。当然,如果你写的程序只在单机环境下面运行,并且不和别人的程序打交道,那么你完全可以忽略字节序的存在。但是,如果你的程序要跟别人的程序产生交互呢?在这里我想说说两种语言。C/C++语言编写的程序里数据存储顺序是跟编译平台所在的CPU相关的,而JAVA编写的程序则唯一采用big endian方式来存储数据。试想,如果你用C/C++语言在x86平台下编写的程序跟别人的JAVA程序互通时会产生什么结果?就拿上面的0x12345678来说,你的程序传递给别人的一个数据,将指向0x12345678的指针传给了JAVA程序,由于JAVA采取big endian方式存储数据,很自然的它会将你的数据翻译为0x78563412。什么?竟然变成另外一个数字了?是的,就是这种后果。因此,在你的C程序传给JAVA程序之前有必要进行字节序的转换工作。

    Java解决方法:

    1 int intValue = 12345;
    2 byte[] bytes1 = ByteUtils.intToBytes(intValue);   //[0, 0, 48, 57]  
    3             
    4 ByteBuffer byteBuffer = ByteBuffer.allocate(4);
    5 byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
    6 byteBuffer.putInt(intValue); 
    7 byte[] bytes2 = byteBuffer.array();    //[57, 48, 0, 0]

    .NET解决方法:

    System.BitConverter.GetBytes(value).Reverse().ToArray();
    
  • 相关阅读:
    git系列3之简单命令(查看不同|文件提交|文件移除|重命名)
    git系列2之简单命令(乱码问题|修改文件提交|忽略文件)
    git系列1之安装初体验(windows)
    mongodb主从复制副本集(12)
    mongodb系统知识(11)
    mongodb系统知识(10)
    linux下h2集群创建,及java集成详细步骤
    windows下创建h2集群,及java集成详细步骤
    MySQL与Oracle 差异比较之一数据类型
    快速恢复update了的orcale数据表
  • 原文地址:https://www.cnblogs.com/CopyPaster/p/5757309.html
Copyright © 2011-2022 走看看