【问题标题】:Parsing a byte array sent over TCP in Java在 Java 中解析通过 TCP 发送的字节数组
【发布时间】:2019-03-24 01:10:11
【问题描述】:

我正在开发一个通过 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 中,byte 数据类型本质上是有符号的,其范围是从 -128 到 127。此外,从 128 到 255 的扩展 ASCII 字符在某种程度上是非标准的,并且因系统而异。

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

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

【问题讨论】:

  • 您很可能需要将其读取为char 的数组,而不是byte 的数组。不过不确定您的 Java 服务是如何实现的。

标签: java c arrays tcp byte


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      问题是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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-13
        • 1970-01-01
        相关资源
        最近更新 更多