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

这个问题有点类似于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#无法以正确的方式读取它。

参考方案

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

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

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

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

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

Java 8`Stream`可以并行运行,甚至不需要您吗? - java

如我所见,在使用Java 8 Stream时,显而易见的代码无论是“对象”流还是原始流(即IntStream和朋友)都将仅使用:someStreamableResource.stream().whatever() 但是,然后,相当多的“流媒体资源”也有了.parallelStream()。读取javadoc时不清楚的是.stream()流是否始终是顺序的,以…

JAVA 8具有任何匹配属性的对象的过滤器列表 - java

我的要求是通过匹配任何属性的字符串来过滤对象列表。例如,假设Contact类具有三个属性:街道,城市,电话。我知道java流过滤器是如何工作的,在这里我必须将输入字符串与每个属性进行比较,如下所示:contactList.stream().filter(contact -> contact.getStreet().equals("dubai&…

检查Optional中是否存在null属性,并返回String Java Stream API - java

我有以下class Person private String firstName; private String familyName; // Setters and Getters 我有以下方法public String getFullName(Optional<Person> persons) { return persons .map(p…

Java 8流:处理空值 - java

以下代码为属性Salary为null抛出NPE。class Person具有以下属性:字符串:name,整数:age,整数:薪金salary在此处可以为null。我想创建一份工资清单。persons.stream().mapToDouble(Person::getSalary).boxed().collect(Collectors.toList())在这里,…

Java 8 Streams过滤和收集是否返回对列表中相同对象的引用? - java

例如考虑下面的代码List<Reference> references = context.getReferences() .stream() .filter(ref -> ref.getCondition() == SOMETHING_DESIRABLE) .collect(Collectors.toList()); 现在,如果我更改了引…