首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java的Bitconverter

Java的Bitconverter
EN

Stack Overflow用户
提问于 2011-05-03 14:10:59
回答 4查看 21.4K关注 0票数 10

遵循问题https://stackoverflow.com/questions/1738244/what-is-the-java-equivalent-of-net-bitconverter中提供的建议,我已经开始实现我自己的Java位转换器,但没有得到相同的结果。

有没有人能给我指点一下我可能做错了什么?

代码语言:javascript
复制
public static byte[] GetBytes(Integer value) {
    ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
    DataOutputStream stream = new DataOutputStream(byteStream);
    try {
        stream.writeInt(value);
    } catch (IOException e) {
        return new byte[4];
    }
    return byteStream.toByteArray();
}

byte[] result = BitConverter.GetBytes(1234); //JAVA: [0, 0, 4, -46]
byte[] result = BitConverter.GetBytes(1234); //C#: [210, 4, 0, 0]
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-05-03 14:16:30

这只是字节序(-46和210是因为Java的有符号字节,但这只是一个UI问题)。反转数组内容,或者使用移位操作写入int。

注意:.NET发出的字节顺序取决于平台。我建议在这两种情况下都使用已知的ENDIANNESS;最有可能的是在这两种情况下都使用shift操作。或者可能是一个更好的想法:只使用预先设定的、独立于平台的序列化格式(例如: protocol buffers,它在Java和.NET/C#上都有很好的支持)。

例如,如果我向byte[] buffer编写int value (从offset开始),我可能会使用:

代码语言:javascript
复制
buffer[offset++] = (byte)value;
buffer[offset++] = (byte)(value>>8);
buffer[offset++] = (byte)(value>>16);
buffer[offset++] = (byte)(value>>24);

这是保证低端的,类似的代码应该可以在任何框架上工作。

票数 11
EN

Stack Overflow用户

发布于 2011-05-03 14:27:17

C# BitConverter将使用基础架构的字节顺序。在大多数环境中,它都是小端的(就像您的情况一样)。然而,Java的DataOutputStream将始终以大端(“可移植方式”)编写。如果想要匹配行为,则需要检查机器的字节顺序并编写相应的代码。

另外,java中的字节是有符号的,所以输出只是表面上的不同。位的表示是相同的,所以你不需要担心。

要检查机器的字节顺序,请使用java.nio.ByteOrder.nativeOrder()方法。然后使用java.nio.ByteBuffer,您可以在其中指定字节order()并写入数据。

然后你可以像这样实现你的方法:

代码语言:javascript
复制
public static byte[] GetBytes(int value)
{
    ByteBuffer buffer = ByteBuffer.allocate(4).order(ByteOrder.nativeOrder());
    buffer.putInt(value);
    return buffer.array();
}
票数 4
EN

Stack Overflow用户

发布于 2016-06-28 21:56:59

如果有任何指向JAVA BitConverter.ToInt32的主体need..C#

代码语言:javascript
复制
  public static int toInt32_2(byte[] bytes, int index)
        {
            int a = (int)((int)(0xff & bytes[index]) << 32 | (int)(0xff & bytes[index + 1]) << 40 | (int)(0xff & bytes[index + 2]) << 48 | (int)(0xff & bytes[index + 3]) << 56);
            // int a = (int)((int)(0xff & bytes[index]) << 56 | (int)(0xff & bytes[index + 1]) << 48 | (int)(0xff & bytes[index + 2]) << 40 | (int)(0xff & bytes[index + 3]) << 32);
            //Array.Resize;
            return a;
        }

也就是Int16

代码语言:javascript
复制
    public static short toInt16(byte[] bytes, int index) //throws Exception
    {
        return (short)((bytes[index + 1] & 0xFF) | ((bytes[index] & 0xFF) << 0));
        //return (short)(
        //        (0xff & bytes[index]) << 8 |
        //                (0xff & bytes[index + 1]) << 0
        //);
    }

BitConverter.getBytes

代码语言:javascript
复制
public static byte[] GetBytesU16(long value)
{

    ByteBuffer buffer = ByteBuffer.allocate(8).order(ByteOrder.nativeOrder());
    buffer.putLong(value);
    return buffer.array();
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5865728

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档