Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中是否有类似于指针函数的java ByteBuffer函数_Java_C_Pointers_Performance_Bytebuffer - Fatal编程技术网

C中是否有类似于指针函数的java ByteBuffer函数

C中是否有类似于指针函数的java ByteBuffer函数,java,c,pointers,performance,bytebuffer,Java,C,Pointers,Performance,Bytebuffer,我正在使用ByteBuffer使用JavaNIO传输数据。同一消息可以发送到多个接收器。消息格式为“消息头+消息内容”。最简单的方法是为每个接收器分配一个新的字节缓冲区。这是无效的 我的问题是C/C++中是否有类似的java函数用于ByteBuffer to pointer函数。因此,我可以使用一个缓冲区来保存消息内容,并使用不同的头进行连接。这样,就是效率 谢谢 在Java中,您可以使用GatheringByteChannel(您很可能正在处理这个问题)。它允许有一个包含头的静态缓冲区和一个单

我正在使用ByteBuffer使用JavaNIO传输数据。同一消息可以发送到多个接收器。消息格式为“消息头+消息内容”。最简单的方法是为每个接收器分配一个新的字节缓冲区。这是无效的

我的问题是C/C++中是否有类似的java函数用于ByteBuffer to pointer函数。因此,我可以使用一个缓冲区来保存消息内容,并使用不同的头进行连接。这样,就是效率


谢谢

在Java中,您可以使用
GatheringByteChannel
(您很可能正在处理这个问题)。它允许有一个包含头的静态缓冲区和一个单独的缓冲区,用于每个保存不同内容的客户机。对于一些要开始使用的材料,您可能希望查看以下博客:


我使用一个ByteBuffer发送到多个接收器

ByteBuffer bb = ByteBuffer.allocateDirect(LARGE_BUFFER);
bb.clear();
bb.position(START_OF_CONTENT /* 1024 */);
appendContentTo(bb);
int endOfContent = bb.position();

bb.limit(endOfContent);
for(Connection conn: connections) {
    bb.position(START_OF_CONTENT);
    /* prepend header BEFORE the position and move the position back */
    conn.prependHeader(bb); 
    conn.write(bb);
}
这样,您可以对每个连接使用相同的ByteBuffer。内容只有一个副本

conn.prependHeader()可能的示例

public void prependHeader(ByteBuffer bb) {
    // bb starts at the start of the content.
    int pos = bb.position();
    // it would be better if a byte[] wasn't required. This is just an example
    byte[] header = getHeaderAsBytes();
    bb.position(bb.position()-header.length);
    bb.put(header);
    // bb starts at the start of the header.
    bb.position(bb.position()-header.length);
}

对我来说,它转化为两字节数组的串联,可以使用System.arraycopy轻松处理。如果你的意思是其他的,请提供一些例子,说明你拥有什么以及你想要实现什么。@d-live这可以不用复制就完成,请看我的答案。@Waldheinz,事实上,只需一个ByteBuffer就可以完成,请看我的答案。。)我能把这个方法应用到SocketChannel上吗?老实说,我不明白你的答案。
prependHeader
从哪里来?@Susan,你可以在任何可以使用ByteBuffer的地方应用它。这是因为write()不是破坏性的,您可以一次又一次地对相同的数据使用相同的缓冲区。@Waldheinz,就像
appendContentTo
,您必须编写它。根据评论了解需要做什么。;)@Waldheinz,我为这个方法添加了一个示例。