【问题标题】:How to read find length of packets in bytes如何读取以字节为单位的数据包长度
【发布时间】:2015-03-05 17:07:13
【问题描述】:

如何使用 DataInputStream 及其 readUnsignedShort/readUnsignedByte 方法找到数据包的长度。

包头为7字节,如下:

TT TT SS SS SS VV

在哪里: TT 是类型 SS 是尺寸 VV 是版本

我需要找到数据包的大小,然后将它的 HexBinary 打印到在标头中找到的给定字节。

我需要使用他的 DataInputStream 函数来解决这个问题。

谢谢!

【问题讨论】:

    标签: java sockets proxy packet


    【解决方案1】:

    阅读有关位移的文档:

    Bitwise and Bit Shift Operators

    例如,假设您显示的内容以字节表示:

    int type = stream.readUnsignedShort();
    
    int size = stream.readUnsignedShort();
    size <<= 8;
    size |= stream.readUnsignedByte();
    
    int version = stream.readUnsignedByte();
    

    或者:

    int type = stream.readUnsignedShort();
    
    int size = stream.readUnsignedByte();
    size <<= 8;
    size |= stream.readUnsignedByte();
    size <<= 8;
    size |= stream.readUnsignedByte();
    
    
    int version = stream.readUnsignedByte();
    

    【讨论】:

    • 谢谢 - 我回家后测试一下。
    • 我认为它不起作用,因为我得到了非常非常大的东西...... 1283112 你可能错过了掩蔽 0xff 吗?
    • 没有。相反,它更有可能是 endian 问题。尝试交换最终整数中字节的顺序。我觉得奇怪的是数据使用 3 字节数字开头(假设数字被编码为字节 - 你仍然没有对此发表评论)。
    • 是的,它是字节。得到类型和大小的工作。版本显示为 0:imagizer.imageshack.com/img673/7982/uttAOU.png 您可以忽略完整数据和大小为 0 的事实。现在可以使用,但版本仍然为 0。
    【解决方案2】:

    如果是字节:

    • readUnsignedShort()读取类型字段

    • 将3字节长度字段和版本字段与readInt()一起读取,并分别用移位和掩码将它们分开。

    【讨论】:

    • 我将如何阅读它们然后转移它们?有没有更快的方法来获取尺寸?
    • 分别带有移位和掩码。右移 8 得到长度;掩码为 0xff 以获取版本。有什么问题?为什么你认为你需要一种更快的方法?
    • 嗯,我不明白那是什么意思或怎么做:S 你有例子吗?我会不会做类似的事情:stuff = socket.readUnsignedInt()
    • “右移”或“掩码”的哪一部分你不明白?这是非常基本的。
    • 所有这些.. 我可能可以在谷歌上搜索如何做到这一点,但我如何首先获得这些东西?
    猜你喜欢
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 2013-05-07
    • 2013-06-28
    • 1970-01-01
    相关资源
    最近更新 更多