通过套接字的整数 - 错误的字节

Integer through socket - wrong bytes

我正在从我的 PC 上的 Tcl 脚本 运行 向 Java 应用程序发送一个整数,即 Android 上的 运行。

Tcl 代码:

set bytes 10
set sock [socket localhost $port]
set binLen [binary format i $bytes]
puts "Sending size: $bytes"
puts $sock $binLen
flush $sock
close $sock

Java 在 Android 端读取代码:

Socket clientSocket = ...; // socket created for connected Tcl script
InputStream inputStream = clientSocket.getInputStream();
DataInputStream dataInputStream = new DataInputStream(inputStream);
byte[] sizeBuffer = new byte[4];
dataInputStream.readFully(sizeBuffer);

现在,当我在调试中预览 sizeBuffer 时,我看到它是:

sizeBuffer = {byte[4]@830050199072}
[0] = 13
[1] = 10
[2] = 0
[3] = 0

这似乎不太正确。关于我想将其转换回整数的信件:

int size = ByteBuffer.wrap(sizeBuffer).order(ByteOrder.LITTLE_ENDIAN).getInt();

但它给出的是 2573,而不是 10,这根据接收到的字节数是显而易见的。

我做错了什么?

您遇到的主要问题是 puts 默认附加一个换行序列(因为它的第一项工作是写出文本供人们阅读)。您平台的默认换行顺序是 carriage-return/newline。写二进制时,你应该做两件事:将通道设置为二进制模式,不要写额外的行终止符。

# Put the channel in binary mode
fconfigure $sock -translation binary
# Write without extra bytes
puts -nonewline $sock $binLen