java 二进制协议解析_java – 如何解析/编码二进制消息格式?

在Java中有一个内置字节类型,你可以使用

InputStream#read(byte[])读入byte []缓冲区并使用

OutputStream#write(byte[], int, int)写入OutputStream,所以没有问题.

关于你的消息 – 正如你所说的那样,你一次获得的最微小的信息是一个字节,所以你必须先将你的消息格式分解为8位块:

假设您的消息位于byte []命名数据中.我也假设小端.

uint32是32位长 – >这是四个字节. (在Java中解析这个问题时要小心,Java整数和长整数都已签名,你需要处理它.一个避免麻烦的简单方法就是需要很长时间.数据[0]填充位31 – 24,数据[1] 23 – 16,数据[2]位15 – 8和数据[3]位7到0.所以你需要将它们适当地向左移动并用逻辑OR将它们粘合在一起:

long uint32 = ((data[0]&0xFF) << 24) |

((data[1]&0xFF) << 16) |

((data[2]&0xFF) << 8) |

(data[3]&0xFF);

接下来,有两个单位.我想你必须检查它们是“开”(1)还是“关”(0).为此,您使用位掩码并将您的字节与逻辑AND进行比较.

第一位:(二进制掩码| 1 0 0 0 0 0 0 0 | = 128 = 0x80)

if ( (data[4] & 0x80 ) == 0x80 ) // on

第二位:(二进制掩码| 0 1 0 0 0 0 0 0 | = 64 = 0x40)

if ( (data[4] & 0x40 ) == 0x40 ) // on

要编写下一个uint32,您必须在基础数据的字节边界上组合字节.例如.对于第一个字节,取剩下的6位数据[4],将它们向左移动两个(它们将是uint32的第8位到第2位)并通过移位“添加”第一个(最高的)两个数据[5]它们在右边6位(它们将占用uint32的剩余1和0槽). “添加”意味着逻辑OR’ing:

byte uint32Byte1 = (byte)( (data[4]&0xFF) << 2 | (data[5]&&0xFF) >> 6);

然后,构建uint32的过程与第一个示例中的过程相同.等等等等.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值