[英]Converting Byte Array to Int Array to send over java socket
嗨,我是Java開發的新手,有以下問題。
我用值{130,56,0,0,2,0,0,0}構造了一個char數組。 然后,我使用String.valueOf()將這些值傳遞到String中,一旦完成,我將使用getBytes()函數將字符串轉換為字節數組。
我使用DataOutputStream編寫器將數據寫入套接字。 我的問題在於以下事實:在tcp級別上,使用wireshark跟蹤數據,我實際上是在網上發送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 socket writer在網上發送130 56 0 0 2 0 0 0
為爭辯說,以下是必要的
String StringMsg = String.valueOf(Map, 0, Map.length);
byte[] data = StringMsg.getBytes();
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具有兩個用於左字節移位的運算符>>
和>>>
(第二個運算符不“攜帶”符號位)。
順便說一下,Java基本類型是大端字節序的-即使底層體系結構不是。
您必須了解十六進制A
和字符A
之間的區別。 十六進制A表示二進制值1010
,而字符A
則不是。 考慮到這一點,如果您要存儲字節,只需使用字節數組或ByteBuffer
我用值{130,56,0,0,2,0,0,0}構造了一個char數組。
為什么?
然后,我使用String.valueOf()將這些值傳遞給String。
為什么? String
不是二進制數據的容器。
一旦完成,我將使用getBytes()函數將字符串轉換為字節數組。
為什么?
為什么不將原始數據直接構造為字節數組並剪切整個Palaver?
我使用DataOutputStream編寫器
DataOutputStream
是流,而不是Writer.
將數據寫入套接字。 我的問題在於以下事實:在tcp級別上,使用wireshark跟蹤數據,我實際上是在網上發送c2 82 38 00 00 02 00 00 00,而不是原始的130 56 0 0 2 0 0 0。
完全符合預期。 那么,為什么不將原始數據作為字節數組發送,並減少幾個容易出錯的步驟呢?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.