使用Java字符数组处理C字符数组

4

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

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

我的主要问题是,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

以下是一个Android应用程序的Java代码部分:

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
            ....
    }
}

如果您有任何解决此问题的建议,我将非常感激。

谢谢,Gus。


1
如果您能够隔离出一个“最小化的案例”,并提供C源代码和Java源代码,那么这可能会有所帮助。 - Vatine
你的代码可能有很多种方式出错。我同意Vatine的看法,看到代码会帮助我们帮助你。 - NPE
2个回答

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)

或者使用其他的两个参数构造函数,它们允许您指定如何将字节解码为字符。


谢谢你的回答,但是这样做的问题在于类 BufferedReader 中的函数不接受字节类型作为参数。关于你提到的转换,你能提供任何用 Java 实现的代码吗?或者其他替代方案?谢谢。 - gus
非常感谢您提供的信息,有了您提供的关于通过套接字传输字节的信息,我解决了我遇到的问题。 - gus

1

使用Java的byte类型,它是一个8位的带符号整数。同时确保你在C中的char类型也是8位的。可以使用Boost StaticAssert工具来确保这一点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接