繁体   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