Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.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
帮助实现目标c-java字节移位_Java_C_Byte_Shift_Byte Shifting - Fatal编程技术网

帮助实现目标c-java字节移位

帮助实现目标c-java字节移位,java,c,byte,shift,byte-shifting,Java,C,Byte,Shift,Byte Shifting,我正在Java和iPhone/objC客户端之间发送数据。Java客户机有一个已建立的中间件组件,我正在使用它来测试新客户机与中间件的集成 所有字节移位操作都有问题。Java代码正在生产中,无法修改。由于双似乎是最广泛的,我将张贴它 要从objC发送: -(void)putDouble:(NSNumber *)v{ unsigned long long n = [v unsignedLongLongValue]; dataToSend = [NSMutableData dat

我正在Java和iPhone/objC客户端之间发送数据。Java客户机有一个已建立的中间件组件,我正在使用它来测试新客户机与中间件的集成

所有字节移位操作都有问题。Java代码正在生产中,无法修改。由于双似乎是最广泛的,我将张贴它

要从objC发送:

-(void)putDouble:(NSNumber *)v{

    unsigned long long n = [v unsignedLongLongValue];

    dataToSend = [NSMutableData data];

    long long i = (int)n & 0x0ff;
    [dataToSend appendData:[NSMutableData dataWithBytes:&i length:sizeof(n)]];


    i = ((int)n >> 8) & 0x0ff;
    [dataToSend appendData:[NSMutableData dataWithBytes:&i length:sizeof(n)]];


    i = ((int)n >> 16) & 0x0ff;
    [dataToSend appendData:[NSMutableData dataWithBytes:&i length:sizeof(n)]];


    i = ((int)n >> 24) & 0x0ff;
    [dataToSend appendData:[NSMutableData dataWithBytes:&i length:sizeof(n)]];


    i = ((int)n >> 32) & 0x0ff;
    [dataToSend appendData:[NSMutableData dataWithBytes:&i length:sizeof(i)]];


    i = ((int)n >> 40) & 0x0ff;
    [dataToSend appendData:[NSMutableData dataWithBytes:&i length:sizeof(i)]];


    i = ((int)n >> 48) & 0x0ff;
    [dataToSend appendData:[NSMutableData dataWithBytes:&i length:sizeof(i)]];


    i = ((int)n >> 56) & 0x0ff;
    [dataToSend appendData:[NSMutableData dataWithBytes:&i length:sizeof(i)]];
    [self send:dataToSend];

}
Java收到:

/*
 * Retrieve a double (64-bit) number from the stream.
 */
private double getDouble() throws IOException
{
    byte[] buffer = getBytes(8);

    long bits =
            ((long)buffer[0] & 0x0ff) |
            (((long)buffer[1] & 0x0ff) << 8) |
            (((long)buffer[2] & 0x0ff) << 16) |
            (((long)buffer[3] & 0x0ff) << 24) |
            (((long)buffer[4] & 0x0ff) << 32) |
            (((long)buffer[5] & 0x0ff) << 40) |
            (((long)buffer[6] & 0x0ff) << 48) |
            (((long)buffer[7] & 0x0ff) << 56);

    return Double.longBitsToDouble(bits);
}

`

ObjC代码传输长整数的位模式(由unsignedLongValue获得),Java代码试图将其解释为double的位模式。当作为ULL访问doubleValue时,应该使用doubleValue获得double的位模式

double nd = [v doubleValue];
unsigned long long n = *(long long *)&nd;

ObjC代码传输长整数的位模式(由unsignedLongValue获得),Java代码试图将其解释为double的位模式。当作为ULL访问doubleValue时,应该使用doubleValue获得double的位模式

double nd = [v doubleValue];
unsigned long long n = *(long long *)&nd;

正如@Vovanium所指出的,您将得到double的long-long值,对于您的示例,它将返回-13456。没有分数,就没有指数

在轮班和蒙版操作中,过早地将其转换为int。您需要在移位和遮罩后应用投射。此外,将其包装在循环中可以减少要更改的代码量

int i;
int j;

for (j = 0; j < sizeof(n); j++) {
    i = (int)(n >> (j*8)) & 0x0ff;
    [dataToSend appendData:[NSMutableData dataWithBytes:&i length:sizeof(i)]];
}
[self send:dataToSend];
尝试使用-1.0的值进行测试。用于-1.0的IEEE 754位模式为:

0xbff0000000000000
并且,当序列化时,字节将是

00 00 00 00 00 00 f0 bf
如果您得到以下字节:

bf f0 00 00 00 00 00 00
您遇到了endian顺序问题。如果是这样的话,那么你 将示例代码中的行更改为

    i = (int)(n >> ((sizeof(n) - j - 1)*8)) & 0x0ff;

这正好颠倒了long-long的解码顺序。

正如@Vovanium所指出的,您得到的是double的long-long值,对于您的示例,它将返回-13456。没有分数,就没有指数

在轮班和蒙版操作中,过早地将其转换为int。您需要在移位和遮罩后应用投射。此外,将其包装在循环中可以减少要更改的代码量

int i;
int j;

for (j = 0; j < sizeof(n); j++) {
    i = (int)(n >> (j*8)) & 0x0ff;
    [dataToSend appendData:[NSMutableData dataWithBytes:&i length:sizeof(i)]];
}
[self send:dataToSend];
尝试使用-1.0的值进行测试。用于-1.0的IEEE 754位模式为:

0xbff0000000000000
并且,当序列化时,字节将是

00 00 00 00 00 00 f0 bf
如果您得到以下字节:

bf f0 00 00 00 00 00 00
您遇到了endian顺序问题。如果是这样的话,那么你 将示例代码中的行更改为

    i = (int)(n >> ((sizeof(n) - j - 1)*8)) & 0x0ff;

这正好颠倒了long-long的解码顺序。

如果发送的数据大小为sizeof(n)(8字节)或sizeof(i)(4字节),则一次只能读取8或4个字节,而不是一个字节。相反,我怀疑您打算一次发送一个字节,因此可能数据类型应该是一个字节,长度应该是1。

如果您发送的数据是sizeof(n)(8字节)或sizeof(I)(4字节),您应该希望一次读取8或4个字节,而不是一个字节。相反,我怀疑您打算一次发送一个字节,因此可能数据类型应该是一个字节,长度应该是1。

谢谢-这是有道理的,但我似乎不理解我试图转换的putDouble函数。下面是java客户机用于向流发送双精度:/**写入双精度(64位)数字的代码。*/private void putDouble(double number)抛出IOException{long n=double.doubleToLongBits(number);//必须以相反的顺序写入才能成为可兼容的流。write((int)(n)和0x0ff);stream.write((int)(n>>>8))&0x0ff;stream.write((int)((n>>16))&0x0ff);stream.write((int)((n>>24))&0x0ff);stream.write((int)((n>>>>32))&0x0ff);stream.write((int)((n>>>40))&0x0ff);stream.write((int)((n>>>48))&0x0ff);stream.write((int)((n>>>56))&0x0ff);}谢谢-这很有意义,但我似乎不理解我正在尝试转换的putDouble函数。下面是java客户端用来发送双精度的代码:/**写双精度流中的(64位)数字。*/private void putDouble(double number)抛出IOException{long n=double.doubleToLongBits(number);//必须以相反顺序写入这些数据才能成为可兼容的流。write((int)(n)&0x0ff);stream.write((int)((n>>8))&0x0ff;stream.write((int)((n>>16))&0x0ff);stream.write((int)((n>>>24))&0x0ff;stream.write((int)((n>>>32))&0x0ff);stream.write((int)((n>>>40))&0x0ff);stream.write((int)((n>>>48))&0x0ff);stream.write((int)((n>>56))&0x0ff);}谢谢你意识到了我的下一个问题。它现在对java有效,但没有回到objC。但是我有足够的信息来危险。所以理解来自工作,而不是阅读。谢谢你意识到了我的下一个问题。它现在对java有效,但没有回到objC。但是我有足够的信息来危险。所以理解来自工作,n阅读。