这个问题有点类似于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# 那样将其写为无符号字节
值序列?
我尝试过这个:
ByteBuffer byteBuffer = ByteBuffer.allocate(4 * dataLength);
IntBuffer intBuffer = byteBuffer.asIntBuffer();
intBuffer.put(intData);
outputStream.write(byteBuffer.array());
编写顺利,但 C# 无法以正确的方式读取它。
最佳答案
Since unsigned byte[] does not exist [...]
你不在乎。无论有符号还是无符号,一个字节最终都是 8 位。只需使用常规的 ByteBuffer 并在其中写入各个字节即可。
在 C# 和 Java 中,1000 0000
(例如)与字节的二进制表示完全相同;事实上,在 C# 中它可以被视为无符号值,而在 Java 中则不然,只要您不对该值进行任何算术运算,这一事实就无关紧要。
当您需要它的可读表示并且希望它是无符号的时,您可以使用 (int) (theByte & 0xff)
(您需要掩码,否则转换将“携带“符号位)。
或者,如果您使用 Guava,则可以使用 UnsignedBytes.toString()
.
关于c# - 如何在文件上的 C# 和 Java 之间读取/写入无符号字节数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22576190/