标签: bytebuffer

Java:在原始数组上使用类型双关?

我需要能够将字节数组与其他原始类型数组相互转换,但不是强制转换,我需要类型 punning没有铸造的原始副本的正确术语?

我认为可以执行以下操作:

// idea: byte[12] -> int[3], and int[3] -> byte[12]

int[] ints;

ByteBuffer bb = ByteBuffer.wrap(
    new byte[]{ 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3 });
IntBuffer ib = bb.asIntBuffer();

ints = ib.array(); // java.lang.UnsupportedOperationException
ints = ib.duplicate().array(); // java.lang.UnsupportedOperationException
Run Code Online (Sandbox Code Playgroud)

不幸的是,似乎bb.asIntBuffer()被复制的内容“按位”或“原始”创建一个新的IntBuffer,而造成对现有的ByteBuffer一个新的“视图”。这就是为什么.array()要失败。

我浏览了 JDK 的源代码,发现了一些类,这些类被所有这些缓冲区类使用并且可以做我需要的东西,但是是内部的(例如 class Unsafe)。

虽然我认为我的目标可以通过将字节缓冲区包装在 some 中ObjectInputStream并通过 读取原始值来实现.readInt(),但我认为这将是一种混乱且缓慢的解决方法。

那么,在进行神奇的原始类型算术(移位,检查字节序,...)的情况,还有其他可能的解决方案吗?

注意:我需要两个方向:byte[12] -> …

java buffer bytebuffer primitive-types type-punning

4
推荐指数
1
解决办法
2475
查看次数

LibGDX纹理到ByteBuffer

我试图在LibGDX中将纹理转换为Pixmap,这样我就可以将所有像素数据放入ByteBuffer中进行一些实验,从我所知道的,我应该可以通过执行以下操作来实现:

Pixmap pixmap = textureName.getTexture().getTextureData().consumePixmap();
ByteBuffer data = pixmap.getPixels();
Run Code Online (Sandbox Code Playgroud)

这似乎返回一个大小合适的Pixmap,而ByteBuffer似乎确实创建得很好,但它完全用零填充,从而产生一个空白的透明图像.这个,以及其他一些测试,让我相信Pixmap本身只是被创建为一个完全透明的图像,但我找不到可能导致这种情况发生的原因.是否有某种限制阻止这种工作,或者我只是遗漏了一些明显的东西?

textures bytebuffer pixmap libgdx

4
推荐指数
2
解决办法
6991
查看次数

Android- 将 ARGB_8888 位图转换为 3BYTE_BGR

我通过这样做得到我的 ARGB_8888 位图的像素数据:

public void getImagePixels(byte[] pixels, Bitmap image) {
    // calculate how many bytes our image consists of
    int bytes = image.getByteCount();

    ByteBuffer buffer = ByteBuffer.allocate(bytes); // Create a new buffer
    image.copyPixelsToBuffer(buffer); // Move the byte data to the buffer

    pixels = buffer.array(); // Get the underlying array containing the data.
}
Run Code Online (Sandbox Code Playgroud)

但是,我想将每个像素存储在四个字节 (ARGB) 上的数据转换为每个像素存储在 3 个字节 ( BGR ) 上的位置。
任何帮助表示赞赏!

java android bytebuffer image bitmap

4
推荐指数
1
解决办法
4313
查看次数

ByteBuffer 类的 rewind() 和 clear() 有什么区别?

请注意,在JDK文档的话rewind()clear()长相都为“清洁” ByteBuffer。实际上旧数据是存在的,而且rewind()应该在channel-write或get操作之前使用,clear()对应channel-read或put操作。

我对给定的描述感到困惑。这些地球上的对应物有什么区别?

java bytebuffer

4
推荐指数
1
解决办法
3713
查看次数

如何从ByteBuffer中获取已使用的byte[]

该类java.nio.ByteBuffer有一个ByteBuffer.array()方法,但是它返回一个数组,该数组是缓冲区容量的大小,而不是已使用的容量。因此,我遇到了很多问题。

我注意到 usingByteBuffer.remaining()给出了缓冲区当前正在使用的字节数,所以基本上我正在寻找的是一种byte[]仅获取正在使用的字节的方法。(即,正在显示的字节ByteBuffer.remaining()

我尝试了一些不同的事情,但我似乎失败了,我能想到的唯一解决方法是使用ByteBuffer剩余缓冲区的分配大小创建另一个,然后向其中写入(x)字节。

java bytebuffer

4
推荐指数
1
解决办法
3742
查看次数

如何找出ByteBuffer中存储的总字节数?

我试图提取我存储在ByteBuffer中的总字节数data_record_value.

下面是我们如何表示data_record_value为一个字节数组,然后从Java代码写入我们的数据库.

Offset   Length (in bytes)          Purpose

0           2                       - clientId byte array
2           8                       - value of lastModifiedDate
2+8         4                       - length of avroBinaryValue array
2+8+4       Y                       - avroBinaryValue array
Run Code Online (Sandbox Code Playgroud)

这就是我从数据库中提取它的方式 -

ByteBuffer data_record_value = r.getBytes("data_record_value");

// now how do I extract total number of bytes I have stored in data_record_value?
Run Code Online (Sandbox Code Playgroud)

在做了一些研究之后,我发现了多种方法来提取我的ByteBuffer中存储的总字节数,我data_record_value不确定哪一个是对的?

第一种方式是:

byte[] b = new byte[data_record_value.remaining()];
record_value.get(b);

// this will be in bytes right?
System.out.println("Byte Array Length: " + b.length);
Run Code Online (Sandbox Code Playgroud)

第二种方式是: …

java byte bytebuffer bytearray

4
推荐指数
1
解决办法
4313
查看次数

如何从ByteBuffer中读取数据

如何读取ByteBuffer中存储的数据?

  • setValue()- 获取值“12 10”并转换为十六进制值并存储在String[]数据中。
  • write()- 将数据转换为字节并存储在ByteBuffer dest.
  • readBuffer- 我如何从中读取数据ByteBuffer
static String[] data = {};
//value = "12 10";
String setValue(String value) {
    String[] samples = value.split("[ ,\n]+");
    data = new String[samples.length];

    //Generates Hex values
    for (int i = 0; i < samples.length; i++) {
        samples[i] = "0x"+String.format("%02x", Byte.parseByte(samples[i]));
    //data[i] will have values 0x0c, 0x0a
        data[i] = samples[i];
    }
    System.out.println("data :: " +Arrays.toString(samples));
    return value;
}


void write(int sequenceNumber, ByteBuffer dest) { …
Run Code Online (Sandbox Code Playgroud)

java bytebuffer

4
推荐指数
1
解决办法
2万
查看次数

从ByteBuffer到双数组

我有一个ByteBuffer包含三个双重值,例如{1.0, 2.0, 3.0}.我现在拥有的是什么

double[] a = new double[3];
for (int i = 0; i < 3; i++) {
    a[i] = byteBuffer.getDouble();
}
Run Code Online (Sandbox Code Playgroud)

哪个工作正常,但我更喜欢一步到位的解决方案

double[] a = byteBuffer.asDoubleBuffer().array();
Run Code Online (Sandbox Code Playgroud)

但这导致了一个例外:

java.lang.UnsupportedOperationException at java.nio.DoubleBuffer.array(...)
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

java nio bytebuffer nio2

4
推荐指数
2
解决办法
1360
查看次数

为什么ByteBuffer不保留putDouble和getDouble的索引?

我在理解ByteBuffer以下场景中的语义时遇到困难:

int sizeOfDouble = 8;
int numberOfDoubles = 4;
ByteBuffer testBuf = ByteBuffer.allocateDirect(sizeOfDouble*numberOfDoubles);

testBuf.putDouble(0, 1.0);
testBuf.putDouble(1, 2.0);
testBuf.putDouble(2, 3.0);
testBuf.putDouble(3, 4.0);

for (int i = 0; i < numberOfDoubles; ++i) {
    System.out.println("testBuf[" + i + "]: " + testBuf.getDouble(i));
}
Run Code Online (Sandbox Code Playgroud)

我希望看到我刚刚把ByteBuffer它打印到屏幕上的值.相反,我得到这个输出:

testBuf[0]: 4.959404759574682E-4
testBuf[1]: 32.50048828125
testBuf[2]: 32.125
testBuf[3]: 4.0
Run Code Online (Sandbox Code Playgroud)

第三个索引的值似乎符合我的预期:4.0.但为什么值和索引0,1和2与我插入的值(分别为1.0,2.0和3.0)不匹配?

我怀疑我误解了一些有关如何ByteBuffer工作的东西,但我无法在javadoc中找到它.

java bytebuffer

4
推荐指数
1
解决办法
69
查看次数

c ++有效地读取每个X字节中的前几个字节

我想读取文件的每个X*16字节中的前16个字节.我编写的代码可以工作,但由于函数调用很多,所以代码很慢.

std::vector<Vertex> readFile(int maxVertexCount) {
    std::ifstream in = std::ifstream(fileName, std::ios::binary);
    in.seekg(0, in.end);
    int fileLength = in.tellg();
    int vertexCount = fileLength / 16;

    int stepSize = std::max(1, vertexCount / maxVertexCount);

    std::vector<Vertex> vertices;
    vertices.reserve(vertexCount / stepSize);
    for (int i = 0; i < vertexCount; i += stepSize) {
        in.seekg(i * 16, in.beg);
        char bytes[16];
        in.read(bytes, 16);
        vertices.push_back(Vertex(bytes));
    }
    in.close();
}
Run Code Online (Sandbox Code Playgroud)

有人可以给我一些建议来提高这段代码的性能吗?

c++ windows performance bytebuffer file

3
推荐指数
1
解决办法
162
查看次数