首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ByteBuffer getInt()问题

ByteBuffer getInt()问题
EN

Stack Overflow用户
提问于 2011-08-04 15:08:22
回答 2查看 13.2K关注 0票数 8

我们使用Java ByteBuffer与C++服务器进行套接字通信。我们知道Java是大端的,套接字通信也是大端的.因此,每当Java接收字节流并将其放入ByteBuffer时,我们就调用getInt()来获取值。没问题,没有皈依。

但是,如果我们具体地将ByteBuffer字节顺序设置为“小端点”(我的同事确实这样做了),

  1. 当数据被放入ByteBuffer中时,Java会自动将大端转换成小端点吗?
  2. 那么,小终端版本的getInt()将向您返回一个正确的值?

我想以上两个问题的答案是肯定的。但是,当我试图验证我的猜测并试图找出getInt()是如何在ByteBuffer中工作时,我发现它是一个抽象的方法。ByteBuffer的唯一子类是没有实现抽象getInt()的MappedByteBuffer类。那么getInt()方法的实现在哪里呢?

对于发送,因为我们使用的是小端点ByteBuffer,所以在放入套接字之前,我们需要将它们转换为大端字节。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-04 15:29:22

那么getInt()方法的实现在哪里呢?

ByteBuffer确实是一个抽象类。有几种方法可以创建字节缓冲区:

  • allocate
  • wrap
  • allocateDirect

在我的JDK中,这些创建了内部类HeapByteBufferDirectByteBuffer的实例。它们各自的getInt函数如下:

代码语言:javascript
复制
// 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);
}

代码语言:javascript
复制
// 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))));
}

在上面,nativeByteOrderbigEndian是两个布尔成员,分别指示配置的字节顺序:(a)匹配本机字节顺序;(b)是大端字节。

票数 3
EN

Stack Overflow用户

发布于 2011-08-04 15:27:29

ByteBuffer将自动使用您指定的字节顺序。(默认情况下为大端)

代码语言:javascript
复制
 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都将重新排序字节。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6943858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档