2012-11-06 50 views
3

通过套接字,我将信息从用C编写的程序发送到用Java编写的程序。使用Java char数组处理C char数组

通过C程序,我通过char数组发送两个字节(使用互联网套接字),并且接收到的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 
      .... 
    } 
} 

任何建议来解决这个问题,我会真的很感激它。

在此先感谢,Gus。

+1

如果您可以隔离以相同方式失败的“最小案例”,则可能会(可能)提供C源代码和Java源代码。 – Vatine

+0

可能有很多方法让你的代码出错。我同意Vatine看到代码会帮助我们帮助你。 – NPE

回答

4

在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参数构造器,让您指定如何字节解码成字符中的一个。

+0

感谢您的回答,但问题是,从类BufferedReader读取的函数不接受字节类型作为参数。关于你提到的转换,你能提供任何代码来做到这一点在Java?或另一种选择?谢谢。 – gus

+0

请参阅编辑我的答案以获取更多信息。 –

+0

非常感谢您的信息,您通过套接字提供的字节传输信息解决了我面临的问题。 – gus

1

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