如何在文件上读取/写入C#和Java之间的无符号字节数组?

时间:2014-03-22 10:10:49

标签: c# java stream interop

这个问题有点类似于my previous one,在那里我问了一个"跨语言"在Java和C#程序之间编写和读取整数的方法。问题是结束。

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

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

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

BinaryWriterBigEndian是......好吧......一个大端二元作家;)

这样,该文件将包含一个序列,例如,由以下值组成的序列(以big-endian表示):

[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#无法以正确的方式阅读。

1 个答案:

答案 0 :(得分:3)

  

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

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

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

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

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