4

ソケットを介して、Cで書かれたプログラムからJavaで書かれたプログラムに情報を送信しています。

Cのプログラムを介して、(インターネットソケットを使用して)char配列を介して2バイトを送信し、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
            ....
    }
}

この問題を解決するための提案があれば、本当にありがたいです。

よろしくお願いします、ガス。

4

2 に答える 2

5

C および C++ では、charデータ型は 8 ビット文字であり、Javabyte型にほぼ対応しています。Java では、基本char型は 16 ビットの Unicode 文字です。Java でバイトから文字 (またはその逆) に変換する場合、バイト ストリームの文字エンコーディング (UTF-8、ISO-8859-1 など) に応じてマッピングを行う必要があるため、知っておく必要があります。 C バイト ストリームのエンコード方法。あなたの場合、それは ISO-8859-1 だと思います。本当にバイナリ データの場合は、Javabyte型を使用する必要があります。

編集:

C から送信されるデータが文字かバイナリか、文字の場合は C プログラムがデータをどのようにエンコードしているか (ISO-8859-1、UTF-8 など) を知る必要があります。

データがバイナリの場合、BufferedInputStreamではなくバイトを読み取るために使用する必要がありますBufferedReader。これは、データがバイナリであるため不要な文字にバイトをデコードします。

データが文字の場合、2 引数のコンストラクターを使用できます

InputStreamReader(InputStream in, String charSetName)

または、バイトを文字にデコードする方法を指定できる他の 2 引数コンストラクターの 1 つ。

于 2012-11-06T18:02:24.177 に答える
1

byte8 ビットの符号付き整数であるJava 型を使用します。またchar、C の型が実際に 8 ビットであることを確認してください。Boost StaticAssert機能を使用して、これを確実に行うことができます。

于 2012-11-06T17:44:04.067 に答える