我有从套接字读取的数据,并且我知道它具有以下格式:
[2bytes][8bytes][2bytes] = 12 字节
如果您已经有从套接字读取字节的代码,则可以使用 ByteBuffer 将字节转换为 short、int、long 等值。
Socket s = .....;
InputStream in = s.getInputStream();
byte [] buf = new byte[12];
// read 12 bytes from socket into bytes
in.read(buf);
ByteBuffer bb = ByteBuffer.allocate(buf.length);
bb.order(ByteOrder.LITTLE_ENDIAN);
bb.put(buf);
bb.flip();
short short1 = bb.getShort();
long long1 = bb.getLong();
short short2 = bb.getShort();
请注意将字节缓冲区设置为小端的调用。
当您执行 od 命令时,您会得到类似于以下内容的输出(此输出来自我在系统上创建的用于模仿您的文件)。od -h 命令从文件中读取字节,以 little endian 模式将它们组合为 2 字节的 short,然后以十六进制打印出 short 值。
$ od -h binary.dat
0000000 02eb 02fe fe02 fefe 02fe 02fe 000a
0000015
但是,如果您使用 -tx1 ,您会以它们在文件中出现的真实顺序看到字节。
$ od -tx1 binary.dat
$ 0000000 eb 02 fe 02 02 fe fe fe fe 02 fe 02 0a
$ 0000015
如果你在你的文件上运行它,我想你会看到它实际上是 13 个字节而不是 14 个字节,并且由单个 LF 终止,而不是 CRLF。您看到的“额外”字节是 od -h 的“礼物”,实际上并不存在于文件中。
无论如何,第一个字节是值 235(十六进制的 EB)。第二个字节是 2。问题是 - 第一个短期需求的正确值是多少。如果根据您的套接字协议,数据以小端模式序列化,则连接成短字节的这两个字节的值为 02EB 十六进制或 747。如果套接字协议使用大端,则值为 EB02 十六进制或 60162。
ByteBuffer 方法为您提供了灵活性,并允许您以大端或小端方式进行读/写。它还允许您将数据的读取从套接字(到字节数组)中分离出来,然后再将数据转换为数字。这可能使单元测试更容易,因为您可以为各种测试用例创建字节数组并确保您的解析代码按预期工作。
sharadendu 的答案中的 DataInputStream 方法也可以工作——但前提是套接字协议是大端的。DataInputStream 被硬编码为大端。