Gestion des tableaux de caractères C avec des tableaux de caractères Java

Par un socket, j’envoie des informations d’un programme écrit en C à un programme écrit en Java.

Grâce au programme en C, j’envoie deux octets via un tableau de caractères (à l’aide d’une prise Internet) et les informations reçues en Java sont également stockées dans un tableau de caractères.

Mon problème principal est que les informations reçues dans le tableau Java ne correspondent pas correctement aux informations transmises par le programme C.

J’ai lu que les caractères en Java ont une longueur de 16 bits et que les caractères en C ont une longueur de 8 bits. C’est peut-être le problème, mais je ne sais pas comment gérer / résoudre cela.

Le code C pour envoyer des informations est le suivant:

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 

Une partie du code Java (pour une application Android) est la suivante:

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

Toute suggestion pour résoudre ce problème, je l’apprécierais vraiment.

Merci d’avance, Gus.

En C et C ++, le type de données char est de 8 bits, ce qui correspond à peu près au type d’ byte Java. En Java, le type de caractère fondamental est un caractère Unicode 16 bits. Lorsque vous convertissez des octets en caractères (ou inversement) en Java, un mappage doit avoir lieu, en fonction du codage des caractères du stream d’octets (UTF-8, ISO-8859-1, etc.), vous devez donc savoir comment le stream d’octets C est codé. Dans votre cas, je suppose que c’est ISO-8859-1. S’il s’agit vraiment de données binarys, vous devez utiliser le type d’ byte Java.

MODIFIER:

Vous devez savoir si les données envoyées à partir de C sont des caractères ou des caractères binarys et, caractère par caractères, comment le programme C les code (ISO-8859-1, UTF-8, etc.).

Si les données sont binarys, vous devez utiliser BufferedInputStream pour lire les octets, et non BufferedReader , qui décode les octets en caractères, ce que vous ne souhaitez pas, car les données sont binarys.

Si les données sont en caractère, vous pouvez utiliser le constructeur à 2 arguments

 InputStreamReader(InputStream in, Ssortingng charSetName) 

ou l’un des autres constructeurs à 2 arguments qui vous permettent de spécifier le décodage d’octets en caractères.

Utilisez le type d’ byte Java, qui est un entier signé de 8 bits. Assurez-vous également que votre type de caractère en C est en fait 8 bits. La fonction Boost StaticAssert peut être utilisée pour garantir cela.