【问题标题】:Handling C char arrays with Java char arrays使用 Java char 数组处理 C char 数组
【发布时间】:2012-11-06 17:39:35
【问题描述】:

通过套接字,我将信息从用 C 编写的程序发送到用 Java 编写的程序。

通过 C 语言的程序,我通过一个 char 数组(使用 Internet 套接字)发送两个字节,并且在 Java 中接收到的信息也存储在一个 char 数组中。

我的主要问题是Java数组中接收的信息与C程序传输的信息不正确对应。

我读过 Java 中的字符是 16 位长,而 C 中的字符是 8 位长。这可能是问题所在,但我不知道如何处理/解决。

发送信息的C代码如下:

char buffer[256];
bzero(buffer,256);
n = read(fd, buffer, 255);  // getting info from an uart port, which works properly
n = write(sockfd,buffer,3); // send the information through the socket

部分 Java 代码(用于 Android 应用)如下:

char[] buffer = new char[256];
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
int readX = in.read(buffer, 0, 3);
if (readX > 0) { // I am using a handler to manipulate the info
    Message msg = new Message();
    msg.obj = buffer;
    mHandler.sendMessage(msg);
} 
....
// Part of the handler is the following:
mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
            char[] buffer;
            buffer = (char[])msg.obj; // the information here is different from the one sent from the C program
            ....
    }
}

任何解决这个问题的建议我都会非常感激。

在此先感谢您,格斯。

【问题讨论】:

  • 如果你能隔离出一个以同样方式失败的“最小案例”,展示 C 源代码和 Java 源代码,它(可能)会有所帮助。
  • 您的代码可能会在很多方面出错。我同意 Vatine 的观点,即查看代码将帮助我们帮助您。

标签: java c sockets


【解决方案1】:

在 C 和 C++ 中,char 数据类型是 8 位字符,大致对应于 Java 的 byte 类型。在 Java 中,基本的 char 类型是 16 位 Unicode 字符。当您在 Java 中从字节转换为字符(或反之亦然)时,必须进行映射,具体取决于字节流的字符编码(UTF-8、ISO-8859-1 等),因此您必须知道C字节流是如何编码的。在你的情况下,我猜它是 ISO-8859-1。如果真的是二进制数据,那么你应该使用Java的byte类型。

编辑:

您必须知道从 C 发送的数据是字符还是二进制,如果是字符,C 程序如何对数据进行编码(ISO-8859-1、UTF-8 等)。

如果数据是二进制的,那么您必须使用BufferedInputStream 来读取字节,而不是BufferedReader,它将字节解码为字符,这是您不想要的,因为数据是二进制的。

如果数据是字符,则可以使用2参数构造函数

InputStreamReader(InputStream in, String charSetName)

或其他 2-arg 构造函数之一,可让您指定如何将字节解码为字符。

【讨论】:

  • 感谢您的回答,但这样做的问题是从类 BufferedReader 读取的函数不接受字节类型作为参数。关于您提到的转换,您能否提供任何代码来用 Java 执行此操作?或其他替代方法?谢谢。
  • 非常感谢您提供的信息,您提供的通过套接字进行字节传输的信息解决了我面临的问题。
【解决方案2】:

使用 Java byte 类型,它是一个 8 位有符号整数。还要确保您在 C 中的 char 类型实际上是 8 位。 Boost StaticAssert 工具可用于确保这一点。

【讨论】:

    猜你喜欢
    • 2010-12-25
    • 1970-01-01
    • 2012-04-15
    • 2021-01-26
    • 2018-04-14
    • 2014-02-08
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    相关资源
    最近更新 更多