解析Java中通过TCP发送的字节数组

时间:2018-10-19 07:05:28

标签: java c arrays tcp byte

我正在开发一个嵌入式系统,该系统可以通过TCP发送一些数据。该系统基于ARM,其代码用C编写。 在C端,我有一个 char (或无符号字节,即 uint8_t )数组,它表示一些编码数据:

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

此缓冲区将使用称为SIM800的流行GPRS模块通过TCP / IP协议发送到服务器。微控制器和SIM800之间的连接是UART,即标准串行通信。我可以发送 uint8_t char 数组。在C语言世界中没有什么不同。

在服务器端,存在一些Java服务来接收和解析此数组。

问题是:在C语言中, uint8_t char 数据类型在某种程度上是相同的,即0-> 255等于整个ASCII表。但是据我所知,这在服务器上是不正确的。在Java中, byte 数据类型是固有签名的,范围从-128到127。此外,扩展的ASCII字符(从128到255)在某种程度上是非标准的,并且因系统而异。

Java服务以 String 形式接收数据,然后转换为字节数组。

我很困惑。如果将上述阵列发送到服务器,将会发生什么。 Java服务可以重新解释吗?

3 个答案:

答案 0 :(得分:1)

从TCP流中读取字节后,您可以尝试以下操作

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

答案 1 :(得分:1)

您可以将字节数组转换为base64并发送到Java服务器。然后,Java服务会将其转换回原始字节数组。

答案 2 :(得分:1)

问题在于Java中char和byte之间的转换并不简单,因为它涉及一个字符集。 Latin1或ISO-8859-1字符集是直接转换,其中char的低位字节为原始字节,而高位字节为0。

因此,您必须确保(在Java服务的文档中应该说)服务如何将输入字节转换为String(使用的字符集),然后将相同的字符集用于反向转换。

自然的方法是使用Latin1转换,在这种情况下,Java字节将是uint_t原始字节表示形式的int8_t值。因此,低于128的所有字节应保持不变,并且以128开始的字节将接收original_value - 256。例如255将为-1,128将为-128。