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

标签 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 是...嗯...一个大端二进制编写器;)

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

[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/

相关文章:

javascript - 将 JSON 数据流式传输到 React 会导致 JSON 输入意外结束

c# - Xamarin Admob RewardedVideoAd 代码错误 0 和 3

java - 如何更改所有设备的用户 session 状态(离开、dnd 等)

java - 如果我的主内存没有足够的空间来运行程序怎么办?

java - 如何从另一个 Flux 中排除 Flux 中的所有元素

java - 用于 AVI 动画的 100% Java 编码器

c# - 使用浏览器访问WCF Web服务

C# 对象到字符串并返回

c# - "Format of the initialization string does not conform to specification starting at index 0"如何解决

java - RxJava2 中的条件过滤器