我正在Java和iPhone/objC客戶端之間發送數據。 Java客戶端有一個已建立的中間件組件,我正在使用它來測試新客戶端與中間件的集成。目標c幫助 - 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);
}
當我發[WVDouble頁頭] initWithDouble:-13456.134]從objC
的Java得到雙重5.53E -322
問題出在objC方面,因爲java正在與其他開發人員一起生產nt環境。所有生產客戶端-13456.134都是轉換後的結果。
這裏是sendDouble代碼在Java客戶端使用:`
// Write a double (64-bit) number to the stream.
private void putDouble(double number) throws IOException
{
long n = Double.doubleToLongBits(number);
// have to write these in reverse order to be comptible
stream.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客戶端用於發送的代碼的雙重: – 2010-11-04 13:43:15
/* \t *寫雙(64位)數到流。 \t */ \t私人無效putDouble(雙號)拋出IOException異常 \t { \t \t長N = Double.doubleToLongBits(數); \t \t //必須寫這些以相反的順序被comptible \t \t stream.write((int)的(N)&0x0ff); ((int)((n >>> 8))&0x0ff); \t \t stream.write((int)的((N >>> 16))&0x0ff); stream.write((int)((n >>> 24))&0x0ff); stream.write((int)((n >>> 32))&0x0ff); ((int)((n >>> 40))&0x0ff); stream.write((int)((n >>> 48))&0x0ff); \t \t stream.write((int)的((N >>> 56))&0x0ff); \t} – 2010-11-04 13:43:45