当前位置: 首页 > 知识库问答 >
问题:

Netty ByteBuf到Byte[]解码器

邹杰
2023-03-14

我希望将传入的Netty的Butebuf消息转换为我的类的MyBuffer实例。为此,我使用以下MessageTomessageDecoder:

class ByteArrayDecoder extends MessageToMessageDecoder<ByteBuf> {
  @Override
  protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List<Object> out) throws Exception {
    int length = msg.readableBytes();
    if (msg.hasArray()) {
      out.add(new MyBuffer(msg.array(), msg.arrayOffset(), length));

    } else {
      byte[] bytes = new byte[length];
      msg.getBytes(msg.readerIndex(), bytes);
      out.add(new MyBuffer(bytes, 0, length));
    }
  }
}

现在,由于bytebuf消息是引用计数的,我们必须在处理完它之后释放它。这是由我们正在扩展的MessageTomessageDecoder自动完成的。

现在,既然ButeBuf已经发布,这难道不意味着支持阵列处于危险之中吗?它将被回收,我不确定我会在我的MyBuffer的数组中看到什么。

这个解码器可以安全使用吗?这是正确的编写方式吗?

共有1个答案

傅振濂
2023-03-14

根据@FerryBig的建议,我正在回答我的评论!

bytebuf.array()返回您指定的实际支持数组...

一旦您放弃了对它的句柄/引用,并且引用计数随后下降到0(立即或当其他一切都放弃它的声明时),所有的赌注都取消了。

 类似资料:
  • 问题内容: 我在我的项目中将spark-sql-2.3.1v和kafka与java8一起使用。我正在尝试将主题接收的byte []转换为kafka使用者方面的数据集。 这是详细信息 我有 我定义为 但是消息定义为 我试图定义为 我使用序列化将消息作为byte []发送到kafka主题。 我在Consumer上成功接收到消息字节[]。我正在尝试将其转换为数据集?? 怎么做 ? 出现错误: 线程“主”

  • 问题内容: 我需要将Java BigInteger实例转换为以字节为单位的值。从API中,我获得了此方法,该方法返回一个byte [],其中包含此BigInteger的二进制补码表示形式。 因为我所有的数字都是正的128位(16字节)整数,所以我不需要2的补码形式,即给我128位+符号位(129位)… 有没有一种方法可以直接从BigInteger获取标准(无2的补码形式)表示形式? 如果不是,我如

  • 问题内容: 我的数据库表中有一个blob列,必须在Java程序中将其用作映射,并使用此数据将其转换为或。但是我不知道这样做的时候内部会发生什么。有人能简要解释一下我进行此转换时发生了什么吗? 问题答案: 您可以按以下方式创建和使用字节数组I / O流: 假设你正在使用JDBC驱动程序实现了标准的JDBC Blob接口 (不是所有的事),你可以 同时 连接或使用到BLOB 和方法1,您也可以获取和设

  • 问题内容: 我有两个长度未知的数组,我只想将一个附加到另一个的末尾,即: 我曾尝试使用,但似乎无法使其正常工作。 问题答案: 使用,应类似于以下内容:

  • 问题内容: 我需要将对象转换为byte []以存储在东京内阁键值存储中。从键值存储读取数据时,我还需要将byte []取消字节存储到对象。 有没有可以帮助我完成此任务的软件包?还是自己实施该方案的最佳解决方案? 问题答案:

  • 问题内容: 我想在JNI中对16字节数组进行硬编码,并使用方法将其返回。 这不行 我收到以下错误 NativeCodeCaller.cpp:214:17:错误:’->’的基本操作数具有非指针类型’_JNIEnv’ NativeCodeCaller.cpp:215:78:警告:扩展的初始化程序列表仅在-std = c 0x或-std = gnu 0x时可用 NativeCodeCaller.cpp: