[英]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_t或char數組。 它與C世界沒有區別。
在服務器端,存在一些接收和解析此數組的Java服務。
問題是:在C語言中, uint8_t和char數據類型在某種程度上是相同的,即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.