我在 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 中,因为我在数据包的主要部分接收字符,但有些内容只是字节数据值,这可能是原因......?将开始研究它。