使用Java char数组处理C char数组

gus*_*gus 4 c java sockets

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

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

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

我已经读过Java中的char是16位长,而C中的char是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
Run Code Online (Sandbox Code Playgroud)

以下是部分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
            ....
    }
}
Run Code Online (Sandbox Code Playgroud)

任何解决此问题的建议,我将不胜感激。

预先感谢Gus。

Jim*_*son 5

在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)
Run Code Online (Sandbox Code Playgroud)

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