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

当使用Netty的LengthFieldBasedFrameDecoder时,我应该如何处理ASCII值?

张勇
2023-03-14

我使用的是Netty 4.0.33-Final中的LengthFieldBasedFrameDecoder类。

我正在开发的软件可以在没有Netty的帮助下与电视通信,所以我在这里以非传统的方式使用Netty。我只是使用Netty作为解码器和通道管道来解码来自各种不同设备的消息。那至少是我的目标。

         +-------------------------------------------------+
         |  0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f |
+--------+-------------------------------------------------+----------------+
|00000000| 38 30 31 72 6c 30 30 31 0d                      |801rl001.       |
+--------+-------------------------------------------------+----------------+

问题是LengthFieldBasedFrameDecoder将长度字段解释为十六进制值0x38,并使用十进制值56作为长度,而不是预期的8。当然,这是合乎逻辑的,因为十六进制数0x38的十进制值是56。我认为记录器显示十六进制值0x38的原因是因为ASCII表显示ASCII字符8的十六进制值为0x38。

所以问题是,来自TV的消息没有得到处理,因为解码器正在等待更多的字节来完成它认为完整消息所需的56字节。

作为一个黑客,我编写了这段代码来将消息的第一个字节转换为LengthBasedFrameDecoder可以正确处理的值。

/**
 * This is where I recieve the raw bytes from the TV
 */
public void receive(byte[] data, int length) {

    // rip the first byte off and make it an int
    int messageLength = Integer.parseInt(new String(data).substring(0, 1));

    // convert the int to a byte
    byte[] firstByte = { (byte) messageLength };

    // replace the original first byte with my newly created one
    data[0] = firstByte[0];

    // create the ByteBuf so that I can write it to my awaiting pipeline
    ByteBuf byteBuf = Unpooled.copiedBuffer(data, 0, length);
    channel.writeAndFlush(byteBuf);
}

我是Netty的新手,所以我希望在处理Netty内置的这个场景时,我缺少一些东西。你们能帮我找到处理这件事的正确方法吗?

共有1个答案

仲孙信瑞
2023-03-14

您可以重写LengthFieldBasedFrameDecoder getUnadiustedFrameLength()的实现

public class CustomLengthFieldBasedFrameDecoder extends LengthFieldBasedFrameDecoder {
  @Override
  protected long getUnadjustedFrameLength(ByteBuf buf, int offset, int length, ByteOrder order) {
    buf = buf.order(order);
    byte[] lengthBytes = new Byte[length];
    buf.getBytes(offset, lengthBytes);
    String s = new String(lengthBytes, CharsetUtil.US_ASCII);
    return Long.parseLong(s);
  }
}
 类似资料:
  • 我有一个部署过程,在这个过程中,我将代码签入git存储库,并通过web钩子在生产服务器上运行部署脚本。在该服务器上,我使用ssh和.pem键连接到git,从git拉出,npm安装,构建webpack并重新启动服务进程。 我从来不打算从prod服务器提交任何东西--它们应该能够自动部署。但是,这不起作用,因为文件在运行时经常更新,因此下次部署时,步骤失败,表示我与现有的文件冲突,因为它有未提交的更改

  • 我有一个使用Netty 3.6.6的应用程序。我使用Netty将随机数据包从客户端发送到服务器。 发送方使用此管道: 我用ChannelBuffer包装我的数据包数据,我希望处理程序添加4字节长度,以便接收者可以知道数据包的开始和结束位置。 接收器使用: 一切似乎都按预期工作。发送方一个接一个地发送随机大小的信道缓冲区,接收方以相同的顺序接收相同的信道缓冲器 现在我的问题是: 1.When我向通道

  • 问题内容: 我有一个要连接到MySQL数据库的应用程序。它在半夜断开连接,然后喷出有关连接的信息,并且JDBC在X秒内没有收到消息。 在进行任何需要与SQL Server通信的操作之前,我先打电话给我。 这是我的方法: 在该方法中,我将密码等信息放入字符串中,然后以标准JDBC方式创建连接。 然后我调用此方法: 我可以对这两种方法进行哪些更改以适应丢失的连接? 问题答案: 这不是检索连接的正确方法

  • 问题内容: 我正在学习MySQL并尝试使用子句。当我如下使用它时: 我收到以下错误: MySQL服务器正在使用–secure-file-priv选项运行,因此它无法执行此语句 我该如何解决这个错误? 我已经检查了关于同一错误消息的另一个问题,但仍然找不到解决方案。 我正在使用MySQL 5.6 问题答案: 它按预期工作。您的MySQL服务器已使用--secure-file- priv 选项启动,该

  • 问题内容: 我有一种算法,当前会分配很大的双精度数组,它会经常更新和搜索。数组的大小为N ^ 2/2,其中N是算法在其上进行操作的行数。为了与算法周围的应用程序相关联,我还必须保留整个内容的副本。 当然,这对我的算法可以处理的行数施加了限制,因为我要应对堆的限制。到现在为止,我还没有要求使用该算法的人员更新- Xmx设置以分配更多的空间,并且效果很好。但是,我现在遇到了一个真正的问题,我需要此数组

  • 你和我都想去听音乐会,但只剩下一张票了。我们都试图同时预订那张票。使用AWS SDK for PHP的PHP脚本运行以下updateItem API调用,该调用试图将“票据”的“状态”从0(可用)更改为1(保持)。 对于这个用例,这是正确的方法吗? 有人看过DynamoDB文档吗? 如果这是一个正确的实现,对测试方案有什么建议吗?