问题标签 [bytebuffer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
538 浏览

java - 在 Java 中将一个 Double 数组和两个 Long 数组转储到 ByteBuffer 中

我想将一个 Double 数组和两个 Long 数组转储到一个字节缓冲区中。我可以使用循环并做

这似乎效率不高。有没有办法拒绝倾倒它们?

0 投票
2 回答
12953 浏览

java - ByteBuffer getInt() 问题

我们使用 Java ByteBuffer 与 C++ 服务器进行套接字通信。我们知道 Java 是 Big-endian,而 Socket 通信也是 Big-endian。所以每当Java接收到字节流并将其放入ByteBuffer中时,我们都会调用getInt()来获取值。没问题,没有转换。

但是如果我们以某种方式专门将 ByteBuffer 字节顺序设置为 Little-endian(我的同事实际上是这样做的),

  1. 当数据放入ByteBuffer时,Java会自动将Big-endian转换为Little-endian吗?

  2. 那么 Little-endian 版本的 getInt() 会返回一个正确的值给你吗?

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

对于发送,因为我们使用的是 Little-endian ByteBuffer,所以我们需要将它们转换为 Big-endian 字节,然后才能放入套接字。

0 投票
7 回答
7765 浏览

java - 多个线程可以看到 Java 中直接映射的 ByteBuffer 上的写入吗?

我正在研究使用从内存映射文件(通过FileChannel.map())以及内存中直接 ByteBuffers构建的 ByteBuffers 的东西。我试图了解并发和内存模型约束。

我已经阅读了 FileChannel、ByteBuffer、MappedByteBuffer 等所有相关的 Javadoc(和源代码)。很明显,特定的 ByteBuffer(和相关的子类)有一堆字段,并且状态不受内存模型的保护观点看法。因此,如果跨线程使用该缓冲区,则在修改特定 ByteBuffer 的状态时必须进行同步。常见的技巧包括使用 ThreadLocal 来包装 ByteBuffer、复制(同步时)以获取指向相同映射字节的新实例等。

鉴于这种情况:

  1. B_all管理器为整个文件有一个映射的字节缓冲区(比如它<2gb)
  2. manager 调用 B_all 上的 duplicate()、position()、limit() 和 slice() 来创建一个新的较小的 ByteBuffer B_1,该文件的块并将其提供给线程 T1
  3. manager 做所有相同的事情来创建一个B_2指向相同映射字节的 ByteBuffer 并将其提供给线程 T2

我的问题是:T1 写 B_1 和 T2 写 B_2 可以同时保证看到对方的变化吗?T3 是否可以使用 B_all 读取这些字节并保证看到 T1 和 T2 的更改?

我知道映射文件中的写入不一定会跨进程看到,除非您使用 force() 指示操作系统将页面写入磁盘。我不在乎那个。对于这个问题,假设这个 JVM 是写单个映射文件的唯一进程。

注意: 我不是在寻找猜测(我自己可以很好地猜测)。我想参考一些关于内存映射直接缓冲区保证(或不保证)的明确内容。或者,如果您有实际经验或负面测试用例,也可以作为充分的证据。

更新:我已经做了一些测试,让多个线程并行写入同一个文件,到目前为止,其他线程似乎可以立即看到这些写入。我不确定我是否可以依赖它。

0 投票
2 回答
7595 浏览

java - 需要解释使用 Thrift rpc 传输二进制数据

假设我定义了以下 Thrift 服务

这是我无法理解的生成实现

字符串是如何工作的

? 是同步的还是异步的?它如何处理大数据(几兆字节或更多)?我需要什么来读取这些数据?不幸的是,我不习惯使用 java.nio 和 ByteBuffer。任何示例或指南都会很好。

0 投票
2 回答
1738 浏览

java - 将对象放入 ByteBuffer 而不对其进行序列化

我试图将一个对象放入 ByteBuffer 无济于事。

我正在尝试为 Android 创建一个模仿 DirectX/XNA 顶点缓冲区的 VertexBuffer 类。我的意思是我想允许任何类型的顶点结构(实现某个接口/扩展某个类。)为了做到这一点,我需要将该对象转换为字节 []。

我研究了 Serializable、ByteArrayOutputStream 和 ObjectOutputStream,字节它给了我太多字节。前任。对于 x、y 和 z 具有 3 个浮点数的 Vertex 类应该是大约 3 * 4 或 12 个字节,但结果数组的长度为 51!我很确定额外的字节是序列化的结果,我可能只取数组末尾的字节,但这会更慢,如果有更简单的方法,我会更喜欢。

我还研究了使用 getClass 方法并递归地遍历字段,直到获得原始数据。使用原始数据,我可以使用相应的 put 方法将其直接放入 ByteBuffer 中。这是迄今为止最强大的方法(在我看来),但这似乎比仅使用序列化更困难。

编辑:顶点缓冲区类应该将顶点数据作为字节存储在 ByteBuffer(或其他扩展名)中。顶点数据类应该继承一个“getVertexDeclaration”方法,该方法告诉顶点缓冲区应该如何使用字节。例如:

当传入顶点缓冲区时,这个类将告诉缓冲区它是一个带有位置、纹理坐标和颜色数据的顶点。VertexDeclaration 反映了类的字段。前 12 个字节(Vector3)将用作位置数据。接下来的 8 个字节(Vector2)将用作纹理坐标。最后 4 个字节将用作颜色数据。

回到我的问题,我只是想隔离这些字节以存储在顶点缓冲区中。我在 ByteBuffer 中需要它们的原因是因为 glDrawElements 需要一个 Buffer 与它的其他参数一起传递。

我不想将顶点恢复到原始状态,所以我不需要序列化在创建字节时产生的所有额外内容。

我可以只使用浮点数组和 FloatBuffer,但如果我能弄清楚这将简化​​使用不同类型顶点的过程。

0 投票
1 回答
690 浏览

wpf - RenderTargetBitmap 将原始数据保存到磁盘

我有一个高 fps 的 RenderTargetBitmap 流我想将它们保存到磁盘以便以后处理它们,我不想将它们编码为 Png、bmp 或其他任何东西,我想保存原始字节缓冲区。

那可能吗?

谢谢

0 投票
1 回答
1012 浏览

java - 在 Ruby 中创建类似对象的字节缓冲区

我需要在 Ruby 中创建一个类似 Bytebuffer 的对象。这是我在 JAVA 中的示例

我创建了一条以 4 个字节开头的消息,其中包含消息正文部分的大小,然后是实际消息。我不知道如何在 Ruby 中做到这一点,所以请帮忙。

0 投票
3 回答
150 浏览

java - 是否可以使用 ByteBuffer 类将强类型数据转换为字节?

是否可以使用ByteBuffer该类将强类型数据转换为字节?如果不是,它的主要目的是什么?如果是,我正在查看它的文档,但什么也找不到。例如,这些put方法需要一个字节而不是一个 int。

0 投票
3 回答
26612 浏览

java - ByteBuffer 和字节数组

问题

我需要将两个整数和一个可变长度的字符串转换为字节。

我做了什么

我将每种数据类型转换为字节数组,然后将它们添加到字节缓冲区中。之后我会将该缓冲区复制到一个字节数组中,如下所示。

现在这似乎有点多余。我当然可以将所有内容放入字节缓冲区并将其转换为字节数组。但是,我不知道我的字符串长度是多少。那么在这种情况下我将如何分配字节缓冲区呢?(要分配字节缓冲区,您必须指定其容量)

0 投票
2 回答
1828 浏览

java - ReadableByteChannel 挂起读取(字节缓冲区)

我正在使用 java 1.6 开发即时通讯工具。IM 使用多线程 - 主线程、接收和 ping。对于 tcp/ip 通信,我使用了 SocketChannel。从服务器接收更大的包裹似乎存在问题。服务器而不是一个发送几个包,这就是问题开始的地方。每前 8 个字节说明包的类型和大小。这就是我管理阅读的方式:

在测试期间一切都很好,直到我登录我的帐户并导入我的好友列表。我向服务器发送状态请求,他将 80 个联系人中的大约 10 个发回给我。所以我想出了这样的事情:

并且每个 readStuff() 和 readDescription() 都在检查缓冲区中剩余字节的每个参数大小:

并且 Receiver.receiver.read() 是:

所以应用程序被午餐,记录,然后发送联系人。服务器将我的列表中的一部分发回给我。但是在readInStatus(ByteBuffer headBuffer)方法中,我尝试强制列表的其余部分。现在有趣的部分 - 一段时间后它到达Receiver.receiver.read()并且在bytes = readChannel.read(bb)上它只是停止了,我不知道为什么,即使经过一段时间也没有错误没有什么,我出去了的想法。我整整一周都在与解决方案作斗争,但我没有得到任何解决方案。我将不胜感激任何建议。谢谢。


感谢您的回复。是的,我正在使用阻塞 SocketChannel,我尝试了非阻塞,但它变得疯狂并且失控,所以我跳过了这个想法。关于我期望的字节 - 这有点奇怪,因为它只给了我一次大小,但它的第一部分的大小不是整个包,其他部分根本不包含标题字节。我无法预测它会有多少字节,原因是 - 容量为 255 字节的描述。这正是我在以下位置创建变量好友的原因:public synchronized void readInStatus(ByteBuffer headBuffer) 这基本上是我的好友列表的长度,在读取每个字段之前,我正在检查是否还有足够的字节,如果没有的话,我会read(). 但是描述之前的最后一个字段是带有传入描述长度的整数。但在完成某些处理之前,无法确定包裹的长度。@robert 你认为我应该在那种情况下再次尝试切换到非阻塞 SocketChannel 吗?