1

我有从套接字读取的数据,并且我知道它具有以下格式:

[2bytes][8bytes][2bytes] = 12 字节

我想单独阅读;并且值是十六进制的。实际上,我不久前在 PHP 中捕获了该数据并将其保存到文件中,我可以使用 od (unix) 正确查看它:

$ od -h myFile
$ 0000000 02eb 02fe fe02 fefe 02fe 02fe 000a
$ 0000015 

也就是说,最后有一个 CR 和 LF,产生 14 个字节。如何在 Java 中从套接字读取这些值?例如,我如何获得“02eb”(2 个字节)并将其转换为十进制值?

我已经从套接字读取,我尝试的最后一件事是:

mMessage = mBRin.readLine();
byte[] bytes = mMessage.trim().getBytes()

但这给了我数组中的 18 个字节。

如果有帮助,请在 PHP 中获得我所做的第一部分:

$input = socket_read($value,13,PHP_BINARY_READ);
$trim_input = trim($input);
$float_head = hexdec(bin2hex(substr($input,0,2)));

我想我不明白这一点,这可能是答案

4

2 回答 2

2
Socket socket = ......;
        DataInputStream dis = new DataInputStream(socket.getInputStream());
        short f1 = dis.readShort();
        long f2 = dis.readLong();
        sort f3 = dis.readShort();

要以十六进制打印值,请使用 String.format("%x",f1); 希望能帮助到你 ...

于 2012-09-18T21:06:14.530 回答
2

我有从套接字读取的数据,并且我知道它具有以下格式:

[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 被硬编码为大端。

于 2012-09-19T00:02:36.633 回答