【问题标题】:How to read/write unsigned byte array between C# and Java on a file?如何在文件上读取/写入 C# 和 Java 之间的无符号字节数组?
【发布时间】:2014-03-22 10:10:48
【问题描述】:

这个问题有点类似于my previous one,在那里我问了一种“跨语言”的方式来编写和读取 Java 和 C# 程序之间的整数。问题是字节序。

无论如何,我面临着次要问题。我现在的目标是以 Java 和 C# 都可以处理的方式存储和检索无符号字节数组(值从 0 到 255)。

在 C# 中这很容易,因为 unsigned byte[] 存在:

BinaryWriterBigEndian writer = new BinaryWriterBigEndian(fs);
// ...
writer.Write(byteData, 0, byteData.Length);

BinaryWriterBigEndian 是……嗯……一个大端二进制写入器;)

这样,文件将包含由例如以下值组成的序列(以大端表示):

[0][120][50][250][221]...

现在是时候在 Java 下做同样的事情了。由于此处不存在unsigned byte[],因此该数组作为(带符号的)int[] 存储在内存中,以便能够表示高于 127 的值。 如何像 C# 一样将其编写为 unsigned byte 值的序列?

我试过这个:

ByteBuffer byteBuffer = ByteBuffer.allocate(4 * dataLength);
IntBuffer intBuffer = byteBuffer.asIntBuffer();
intBuffer.put(intData);
outputStream.write(byteBuffer.array());

写得很好,但 C# 无法以正确的方式读取它。

【问题讨论】:

    标签: c# java stream interop


    【解决方案1】:

    由于无符号字节[]不存在[...]

    你不在乎。有符号或无符号,一个字节最终是 8 位。只需使用常规 ByteBuffer 并在其中写入您的各个字节。

    在 C# 和 Java 中,1000 0000(例如)是完全相同的字节二进制表示;在 C# 中它可以被视为无符号值,而不是在 Java 中,这一事实是无关紧要的,只要您不对值进行任何算术运算。

    当您需要它的可读表示并且希望它是无符号的时,您可以使用(int) (theByte & 0xff)(您需要掩码,否则强制转换将“携带”符号位)。

    或者,如果你使用 Guava,你可以使用UnsignedBytes.toString()

    【讨论】:

    • @joppiesaus 是的,我编辑了文本以使其更清晰
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-28
    • 1970-01-01
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    相关资源
    最近更新 更多