我在 Java 中有這種字串
String java_str = "\x00\x00\x00@\x02\t\x01\x00\******
如您所見,有混合的二進制和文本資料。當我通過 python 示例代碼通過套接字發送這個字串時
clientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM);
clientSocket.connect(("127.0.0.1", 11111));
clientSocket.send(bin_data.encode());
我正在接收這個二進制資料

如何使用 Java 套接字將資料發送到服務器以接收二進制資料而不是這樣的字串

uj5u.com熱心網友回復:
您問題中的字串不是有效的 Java:
String java_str = "\x00\x00\x00@\x02\t\x01\x00\...";
因為\x不是有效的 Java 字串轉義。
您的實際 Java 代碼(來自評論)顯然是這樣的:
Socket socket = new Socket("127.0.0.1", 9091);
OutputStream socketOutputStream = socket.getOutputStream();
String s = "\\x00\\x00\\x00@\\x02\\t\\x01\\x00\\x00\\x00\\x00...";
socketOutputStream.write(s.getBytes("ASCII"));
您實際上在那里所做的是逃避反斜杠。所以字串文字實際上包含文字反斜杠、x字符等。(這就是您在資料包轉儲中看到的內容。)
在 Java 字串文字中表達任意 Unicode 代碼點(例如NUL或U 0000代碼點)的方法是使用 Java 的 Unicode 轉義語法;例如\u0000。
String s = "\u0000\u0000\u0000@\u0002\t\u0001\u0000\u0000...";
在 Java 中看到\x Escape 嗎?
在這種情況下,更好的選擇是將資料表示為位元組陣列;例如
byte[] bytes = { 0, 0, 0, '@', 2, '\t', 1, 0, ...};
將二進制資料表示為二進制,而不是將其編碼為文本并將其轉換為二進制,可讀性更強,在概念上也更清晰。
(但請注意,您需要對陣列初始值設定項中的和和任何非常量運算式(byte)之間的任何代碼使用型別轉換。那是因為 Java型別是有符號的...)0x800xffbyte
如果您有一個包含顯式(C / C ?)\xnn序列的 Java 字串,您可以使用一些自定義代碼將其轉換為常規字串。這有點乏味,但編碼相當簡單……如果您以前手動撰寫過詞法分析器。
請注意,常用的 Apache Commons StringEscapeUtils( javadoc ) 類在此處不起作用。 StringEscapeUtils實作對(嚴格的)Java 字串文字語法的反轉義,并且 Java 不識別\xnn字串中的轉義。(StringEscapeUtils甚至不處理\u......這在技術上是正確的,雖然出乎意料。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/313405.html
上一篇:result=result.decode('utf-8')UnicodeDecodeError:'utf-8'編解碼器無法解碼位置321中的位元組0xff:起始
