-1

Javaにバイト配列があります。値は正と負の両方です (元の符号なし配列では 127 より大きいため)。ここで、Quickserver ( http://www.quickserver.org/ ) を使用してこの配列を、私が作成している iOS アプリケーションの TCP クライアントにも送信したいと考えています。入力としてバイト配列を受け入れる sendClientBinary() メソッドにバイト配列を渡します。ただし、iOS クライアント アプリで配列を受け取ると、すべての負の値がある種の補数形式に変換され、主に 2 バイト値に変換されたように見えます。 Netbeans の 0xB9 および -67 (0xBD) は、Xcode では 0xC2 0xBD として表示されます。誰でもこれについて説明してもらえますか?

また、バイト配列をchar配列に変換し、上位バイトをすべてマスクすることもできるため、char配列は0〜255の完全な範囲で正しい値を保持しますが、char配列をに渡す方法はありませんバイト配列のみを入力として受け入れる sendClientBinary() メソッド。どうにかしてchar配列をバイト配列にキャストまたは変換しようとする必要がありますか?

//Some code in Java:
//reading my byte array from a method and converting it to char array (sorry if it's not the most efficient way, just need something simple right now
byte byteArray[] = (byte[])functionReturningByteArray();
char charArray[] = new char[byteArray.length];
for (int ij = 0; ij < byteArray.length; ij++)
{
    charArray[ij] = (char) byteArray[ij];
    if (charArray[ij] > 255)
        charArray[ij] &= 0xFF;
}
//and the code sending the data over TCP socket (via Quickserver):
clientH.setDataMode(DataMode.BINARY, DataType.OUT);
clientH.sendClientBinary(byteArray);
//--this is received in iOS as 16-bit values with some prefix such as 0xC2 or 0xC3 for negative  values, if not for the prefix the value would be correct


//or an attempt to send the charArray:
clientH.setDataMode(DataMode.byte, DataType.OUT);
clientH.sendClientBytes(charArray.toString());
//--this doesn't resemble my bytes once received in iOS at all

//iOS reception code:
case NSStreamEventHasBytesAvailable:
{
    if(stream == inputStream)
    {
        int len = 0;
        len = [inputStream read:receptionBuf maxLength:2048*2048*2];
        packetBytesReceived += len;
        [packetData appendBytes:receptionBuf  length:len];

        NSString* fullData = [[NSString alloc] initWithData:packetData encoding:NSASCIIStringEncoding];
...
...

データパケットの主要部分で文字を受信して​​いるため、問題は NSASCIIStringEncoding にある可能性があると思いますが、一部のコンテンツは単なるバイトデータ値であり、これがおそらく原因である可能性があります...? 取り組み始めます。

4

2 に答える 2

0

0xc2 is the prepend for byte in UTF-8 encoding. It denotes that you are sending a special character in UTF-8 in the 0xc2 sequence. So 0xC2 0xB9 would translate to a superscript character; in particular ^1. My guess (since I assume this is not what you are actually sending) is that your encoding is set incorrectly some place.

于 2013-07-12T21:25:47.080 に答える