我正在从我的PC上运行的Tcl脚本发送一个整数到在Android上运行的Java应用程序。
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
在Android端读取它的Java代码:
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,这根据接收的字节是显而易见的。
我做错了什么?
答案 0 :(得分:0)
您遇到的主要问题是puts
默认会添加换行符(因为它的第一份工作是写出供人阅读的文字)。您平台的默认换行符序列是回车符/换行符。在编写二进制文件时,您应该做两件事:将通道置于二进制模式,而不是写额外的行终止符。
# Put the channel in binary mode
fconfigure $sock -translation binary
# Write without extra bytes
puts -nonewline $sock $binLen