这个问题有点类似于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时,显而易见的代码无论是“对象”流还是原始流(即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()); 现在,如果我更改了引…