我们使用Java ByteBuffer与C++服务器进行套接字通信。我们知道Java是大端的,套接字通信也是大端的.因此,每当Java接收字节流并将其放入ByteBuffer时,我们就调用getInt()来获取值。没问题,没有皈依。
但是,如果我们具体地将ByteBuffer字节顺序设置为“小端点”(我的同事确实这样做了),
我想以上两个问题的答案是肯定的。但是,当我试图验证我的猜测并试图找出getInt()是如何在ByteBuffer中工作时,我发现它是一个抽象的方法。ByteBuffer的唯一子类是没有实现抽象getInt()的MappedByteBuffer类。那么getInt()方法的实现在哪里呢?
对于发送,因为我们使用的是小端点ByteBuffer,所以在放入套接字之前,我们需要将它们转换为大端字节。
发布于 2011-08-04 15:29:22
那么getInt()方法的实现在哪里呢?
ByteBuffer确实是一个抽象类。有几种方法可以创建字节缓冲区:
allocate;wrap;allocateDirect。在我的JDK中,这些创建了内部类HeapByteBuffer和DirectByteBuffer的实例。它们各自的getInt函数如下:
// HeapByteBuffer
public int getInt() {
return Bits.getInt(this, ix(nextGetIndex(4)), bigEndian);
}
public int getInt(int i) {
return Bits.getInt(this, ix(checkIndex(i, 4)), bigEndian);
}和
// DirectByteBuffer
private int getInt(long a) {
if (unaligned) {
int x = unsafe.getInt(a);
return (nativeByteOrder ? x : Bits.swap(x));
}
return Bits.getInt(a, bigEndian);
}
public int getInt() {
return getInt(ix(nextGetIndex((1 << 2))));
}
public int getInt(int i) {
return getInt(ix(checkIndex(i, (1 << 2))));
}在上面,nativeByteOrder和bigEndian是两个布尔成员,分别指示配置的字节顺序:(a)匹配本机字节顺序;(b)是大端字节。
发布于 2011-08-04 15:27:29
ByteBuffer将自动使用您指定的字节顺序。(默认情况下为大端)
ByteBuffer bb =
// to use big endian
bb.order(ByteOrder.BIG_ENDIAN);
// to use little endian
bb.order(ByteOrder.LITTLE_ENDIAN);
// use the natural order of the system.
bb.order(ByteOrder.nativeOrder()); 正如您所指定的那样,直接和堆ByteBuffers都将重新排序字节。
https://stackoverflow.com/questions/6943858
复制相似问题