[英]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.