您好我是Java开发新手并且遇到以下问题。
我构造一个值为{130,56,0,0,2,0,0,0}的char数组。 然后我使用String.valueOf()将这些值传递给String,一旦完成,我使用getBytes()函数将sting转换为字节数组。
我使用DataOutputStream编写器将数据写入套接字。 我的问题在于,在使用wireshark跟踪数据的tcp级别上,我实际上在线路上发送c2 82 38 00 00 02 00 00 00而不是原始130 56 0 0 2 0 0 0。
下面的代码段
public void run() {
System.out.println("Got a client !");
try {
// Accept Loop while connected
while (true) {
byte[] arrOutut = new byte[4096];
int count = clientSocket.getInputStream().read(arrOutut, 0, 4096);
String clientRequest = "";
System.out.println("packet size is " + count + "\n");
if (count != -1) {
for (int outputCount = 0; outputCount < count; outputCount++) {
char response = (char) arrOutut[outputCount];
clientRequest = clientRequest + response;
}
System.out.println("Got a clientrequest "+ clientRequest + "\n");
count = 0;
} else {
break;
}
char[] Map = new char[]{130,56,0,0,2,0,0,0};
String StringMsg = String.valueOf(Map, 0, Map.length);
byte[] data = StringMsg.getBytes();
byte[] asciidata = StringMsg.getBytes("ASCII");
System.out.println("Byte Data "+ data);
System.out.println("Byte Data ACII" + asciidata);
OutputStream dOut = clientSocket.getOutputStream();
DataOutputStream dos = new DataOutputStream(dOut);
int sendDataLength = data.length;
dos.write(data, 0, sendDataLength);
dos.flush();
}
clientSocket.close();
} catch (SocketTimeoutException e) {
System.out.println("Connection timed out");
} catch (IOException e) {
throw new RuntimeException(e);
}
}
无论如何我使用java套接字编写器
在线路上发送130 56 0 0 2 0 0 0为了论证而说以下是必要的
String StringMsg = String.valueOf(Map, 0, Map.length);
byte[] data = StringMsg.getBytes();
答案 0 :(得分:2)
char
并不意味着存储二进制数据。是的,在C中,它存储一个带符号的8位整数;但是,在Java中,char
是UTF16代码单元。
你想要byte
;更具体地说,您需要ByteBuffer
:
final ByteBuffer buf = ByteBuffer.allocate(8);
buf.put((byte) 130);
// etc etc
// send buf.array() on the wire; or use a SocketChannel and use buf directly
是的,每次都要施放到byte
是一件痛苦的事,但事实就是如此:/
此外,很多人都对此感到困惑(当我开始使用来自C的Java时),但原始类型未签名的事实根本不重要;位保持位。例如,字节-128(或Byte.MIN_VALUE
)是1111 1111
。除非你必须对数字执行算术运算,否则原语是负数的事实根本没有影响。顺便说一句,这也是为什么Java有两个左字节移位运算符>>
和>>>
(第二个不&#34;携带&#34;符号位)的原因。
顺便说一句,Java原始类型是大端的 - 即使底层架构不是。
答案 1 :(得分:0)
您必须了解十六进制A
和字符A
之间的区别。 Hex A指的是二进制值1010
,而字符A
则没有。考虑到这一点,如果要存储字节,只需使用字节数组或ByteBuffer
答案 2 :(得分:0)
我构造一个值为{130,56,0,0,2,0,0,0}的char数组。
为什么?
然后我使用String.valueOf()
将这些值传递给String
为什么呢? DataOutputStream
不是二进制数据的容器。
一旦完成,我使用getBytes()函数将sting转换为字节数组。
为什么?
为什么不将原始数据直接构造成一个字节数组并切断整个palaver?
我使用DataOutputStream编写器
Writer.
是一个流,而不是{{1}}
将数据写入套接字。我的问题在于,在使用wireshark跟踪数据的tcp级别上,我实际上在线路上发送c2 82 38 00 00 02 00 00 00而不是原始130 56 0 0 2 0 0 0。
正如预测的那样。那么为什么不将原始数据作为字节数组发送,并删除了几个容易出错的步骤呢?