我一直在研究java-source,以便在将DataOutputStream与DataInputStream结合使用时,了解java如何对其字节数组进行编码和解码。 (我正在用C#编写一个能够解码Java DataOutputStream结果的框架。)
将long编码为字节流的代码为:
public final void More ...writeLong(long v) throws IOException {
writeBuffer[0] = (byte)(v >>> 56);
writeBuffer[1] = (byte)(v >>> 48);
writeBuffer[2] = (byte)(v >>> 40);
writeBuffer[3] = (byte)(v >>> 32);
writeBuffer[4] = (byte)(v >>> 24);
writeBuffer[5] = (byte)(v >>> 16);
writeBuffer[6] = (byte)(v >>> 8);
writeBuffer[7] = (byte)(v >>> 0);
out.write(writeBuffer, 0, 8);
incCount(8);
}
我知道这是使用一系列零填充右移,以便将长转换为一系列8个字节。
为了将这些转换回DataInputStream:
public final long More ...readLong() throws IOException {
readFully(readBuffer, 0, 8);
return (((long)readBuffer[0] << 56) +
((long)(readBuffer[1] & 255) << 48) +
((long)(readBuffer[2] & 255) << 40) +
((long)(readBuffer[3] & 255) << 32) +
((long)(readBuffer[4] & 255) << 24) +
((readBuffer[5] & 255) << 16) +
((readBuffer[6] & 255) << 8) +
((readBuffer[7] & 255) << 0));
}
实现这两个方法(在我的ideone脚本中看到:code)似乎要加倍长。 (您可以在这里看到我已经从read方法中移除了5个(长)强制转换,因为这些导致位移发生在错误的位置)
我的问题是,因为我正在努力解决这些位移操作,这里发生了什么?我以不同于java-source的方式实现它的方式是什么?
答案 0 :(得分:1)
我传递的是整数而不是长整数,这是字节的一半,因此它将输出加倍,因为它一起添加了两组字节!