帮助实现目标c-java字节移位
我正在Java和iPhone/objC客户端之间发送数据。Java客户机有一个已建立的中间件组件,我正在使用它来测试新客户机与中间件的集成 所有字节移位操作都有问题。Java代码正在生产中,无法修改。由于双似乎是最广泛的,我将张贴它 要从objC发送:帮助实现目标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
-(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阅读。