在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的过程与第一个示例中的过程相同.等等等等.