-1

我在 Java 中有一个字节数组。这些值既有正数也有负数(因为它们在原始无符号数组中大于 127)。现在我想用 Quickserver ( http://www.quickserver.org/ ) 将这个数组发送到我正在编写的 iOS 应用程序中的 TCP 客户端。我将字节数组传递给 sendClientBinary() 方法,该方法接受字节数组作为其输入。但是,当我在 iOS 客户端应用程序中收到数组时,所有负值似乎都已转换为某种补码形式,主要是两字节值:Netbeans 中的 -71 (0xB9) 在 Xcode 内存视图中看起来为 0xC2 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 回答
0

问题解决了。我直接从 iOS 应用程序中的 packetData 变量(而不是 NSString 的 fullData)读取我的数据有效负载的二进制部分,而无需先将其转换为字符串,然后再次使用 UTF8 编码解码为字节。

于 2013-07-14T14:53:09.037 回答