簡體   English   中英

解析在Java中通過TCP發送的字節數組

[英]Parsing a byte array sent over TCP in Java

我正在開發一個通過TCP發送一些數據的嵌入式系統。 這個系統是基於ARM的,它的代碼用C語言編寫。在C方面,我有一個char (或無符號字節,即uint8_t )數組,它代表一些編碼數據:

 char buffer[BUFFER_SIZE] = {0, 11, 34,176,255}; // for example.

該緩沖區將通過TCP / IP協議發送到服務器,使用名為SIM800的流行GPRS模塊。 微控制器和SIM800之間的連接是UART,即標准串行通信。 我可以發送uint8_tchar數組。 它與C世界沒有區別。

在服務器端,存在一些接收和解析此數組的Java服務。

問題是:在C語言中, uint8_tchar數據類型在某種程度上是相同的,即0 - > 255等於整個ASCII表。 但據我所知,這在服務器上並非如此。 在Java中, 字節數據類型是內在簽名的,其​​范圍是-128到127.此外,擴展的ASCII字符(128到255)在某種程度上是非標准的,因系統而異。

Java服務以String形式接收數據,然后轉換為字節數組。

我很迷惑。 如果我將上述數組發送到服務器會發生什么。 Java服務可以重新解釋嗎?

從TCP流中讀取字節后,您可以嘗試以下操作

        String str = new String(bytes, 
                                         StandardCharsets.US_ASCII);

您可以將字節數組轉換為base64並發送到java服務器。 然后Java服務將其轉換回原始字節數組。

問題是java中char和byte之間的轉換並不簡單,因為它涉及到charset。 Latin1或ISO-8859-1字符集是直接轉換,其中char的低位字節是原始字節,而高位字節是0。

因此,您必須確保(應該在Java服務的文檔中說明)服務如何將輸入字節轉換為String(使用的字符集是什么),然后使用相同的字符集進行反向轉換。

自然的方式是使用Latin1轉換,在這種情況下,Java字節將是uint_t原始字節表示的int8_t值。 所以低於128的所有字節都應保持不變,從128開始的字節將接收original_value - 256 例如,255將為-1,128將為-128。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM