Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Java应用程序向iOS应用程序发送字节数组(使用quickserver)_Java_Ios_Arrays_Tcp_Bytearray - Fatal编程技术网

从Java应用程序向iOS应用程序发送字节数组(使用quickserver)

从Java应用程序向iOS应用程序发送字节数组(使用quickserver),java,ios,arrays,tcp,bytearray,Java,Ios,Arrays,Tcp,Bytearray,我有一个Java的字节数组。这些值同时为正值和负值(因为它们在原始无符号数组中大于127)。现在,我想用Quickserver()将这个数组发送到我正在编写的iOS应用程序中的TCP客户端。我将字节数组传递给sendClientBinary()方法,该方法接受字节数组作为其输入。但是,当我在iOS客户端应用程序中接收到数组时,所有负值似乎都已转换为某种补码形式,主要转换为两个字节的值:Netbeans中的-71(0xB9)在Xcode内存视图中显示为0xC2 0xB9,Netbeans中的-67

我有一个Java的字节数组。这些值同时为正值和负值(因为它们在原始无符号数组中大于127)。现在,我想用Quickserver()将这个数组发送到我正在编写的iOS应用程序中的TCP客户端。我将字节数组传递给sendClientBinary()方法,该方法接受字节数组作为其输入。但是,当我在iOS客户端应用程序中接收到数组时,所有负值似乎都已转换为某种补码形式,主要转换为两个字节的值:Netbeans中的-71(0xB9)在Xcode内存视图中显示为0xC2 0xB9,Netbeans中的-67(0xBD)在Xcode中显示为0xC2 0xBD。 有人能解释一下吗

我还能够将字节数组转换为字符数组,并屏蔽所有的高位字节,因此现在字符数组在完整的0-255范围内保持正确的值,但是,无法将字符数组传递给只接受字节数组作为输入的sendClientBinary()方法。 我是否应该再次尝试将字符数组转换为字节数组

//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];
...
...
//Java中的一些代码:
//从方法中读取字节数组并将其转换为字符数组(抱歉,如果这不是最有效的方法,现在只需要一些简单的东西
byte byteArray[]=(byte[])函数ReturningByteArray();
char charArray[]=新字符[byteArray.length];
for(int ij=0;ij255)
charArray[ij]&=0xFF;
}
//以及通过TCP套接字(通过Quickserver)发送数据的代码:
setDataMode(DataMode.BINARY,DataType.OUT);
clientH.sendClientBinary(byteArray);
//--这在iOS中作为16位值接收,带有一些前缀,例如0xC2或0xC3表示负值,如果不是前缀,则该值将是正确的
//或尝试发送字符:
clientH.setDataMode(DataMode.byte,DataType.OUT);
sendClientBytes(charArray.toString());
//--这与我在iOS中收到的字节完全不同
//iOS接收代码:
案例NSTRAVENTHASBYTES可用:
{
如果(流==输入流)
{
int len=0;
len=[inputStream读取:receptionBuf maxLength:2048*2048*2];
packetBytesReceived+=len;
[packetData appendBytes:receptionBuf长度:len];
NSString*fullData=[[NSString alloc]initWithData:packetData编码:NSASCISTRINGENCONDING];
...
...

我认为问题可能出在NSASCIIStringEncoding中,因为我在数据包的主要部分接收字符,但有些内容只是字节数据值,这可能是…?将开始处理它的原因。

0xc2是UTF-8编码中字节的前缀。它表示您正在发送UTF-8中的特殊字符在0xc2序列中。因此0xc2 0xB9将转换为上标字符;特别是^1。我的猜测(因为我假设这不是您实际发送的内容)是您的编码在某个位置设置不正确。

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

请发布一些代码。尤其是接收器端的代码。根据传输的数字,一些值的前缀为0xC3(我认为从180开始的较大值的前缀为0xC3)但是,在我的iOS应用程序中,我收到了NSASCIIStringEncoding的值,这可能是原因,我将对此进行检查。