【问题标题】:different results when converting int to byte array - .NET vs Java将 int 转换为字节数组时的不同结果 - .NET 与 Java
【发布时间】:2011-05-06 23:49:58
【问题描述】:

我正在尝试将数据从 java 客户端发送到 c# 服务器,但无法将 int 转换为字节数组。

当我使用 c# 使用此代码转换数字 8342 时:

BitConverter.GetBytes(8342)

结果是:x[4] = { 150, 32, 0, 0 }

我用java:

ByteBuffer bb = ByteBuffer.allocate(4); 
bb.putInt(8342); 
return bb.array();

这里的结果是:x[4] = { 0, 0, 32, -106 }

谁能解释一下?我是 java 新手,这是我第一次在字节数组中看到负数。

【问题讨论】:

    标签: c# java


    【解决方案1】:

    你必须改变字节序:

     bb.order(ByteOrder.LITTLE_ENDIAN)
    

    Java 在内部将事物存储为 Big Endian,而 .NET 默认为 Little Endian。

    Java 和 .NET 在有符号和无符号方面也存在差异。 Java 使用有符号字节,C# 使用无符号字节。你也必须改变它。

    基本上,这就是您看到 -106 ( 150 - 256 ) 的原因

    您将不得不执行以下实用程序方法:

    public static void putUnsignedInt (ByteBuffer bb, long value)
        {
           bb.putInt ((int)(value & 0xffffffffL));
        }
    

    请注意,值很长。

    【讨论】:

    • 嗯,ByteBuffer 已被记录(因此阅读 jdoc 会有所帮助)默认使用 BigEndian,但这实际上是一个有趣的问题,Java 是否定义了使用的 ByteOrder?我对此表示怀疑 - 对性能的影响很大,而且无论如何都不引人注意(除非在编写输出时,我们可以根据文档轻松地将其转换)
    • 我认为现在的输出将是 -106, 32, 0, 0
    • 在添加的行之后:ByteOrder.LITTLE_ENDIAN 数组确实改变了它的顺序。为了让 c# 服务器理解它,我需要将字节数组更改为无符号。有没有办法告诉 ByteBuffer 这样做还是我需要更改每个字节?
    • @idan: -106 和 150 是相同的字节;它们只是以不同的方式转换为字符串或更大的整数。由于 Java 没有办法表示无符号字节,因此在 Java 中无法将 150 表示为一个字节。
    猜你喜欢
    • 2013-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-27
    • 2017-08-22
    • 1970-01-01
    • 2013-06-08
    相关资源
    最近更新 更多