2015-06-03 29 views
1

這裏是轉動4個字節到目標c 32位整數的一個例子。功能的readInt抓鬥從4個字節讀函數,然後將其轉換成一個32位的int。有誰知道我會如何將4個字節轉換爲浮點數?我相信它是大端。基本上我需要一個readFloat函數。我永遠無法掌握這些按位操作。如何把4個字節成浮在目標c從NSData的

編輯: 我忘了提,原始數據來自Java的DataOutputStream類類。 accordign到Java文檔的writeFloat功能是

的浮點參數轉換爲使用中的floatToIntBits方法 Float類一個int,然後寫入該int值到底層 輸出流作爲一個4字節的數量,高字節在前。

這是目標C試圖提取Java寫的數據。

- (int32_t)read{ 
    int8_t v; 
    [data getBytes:&v range:NSMakeRange(length,1)]; 
    length++; 
    return ((int32_t)v & 0x0ff); 
} 

- (int32_t)readInt { 
    int32_t ch1 = [self read]; 
    int32_t ch2 = [self read]; 
    int32_t ch3 = [self read]; 
    int32_t ch4 = [self read]; 
    if ((ch1 | ch2 | ch3 | ch4) < 0){ 
     @throw [NSException exceptionWithName:@"Exception" reason:@"EOFException" userInfo:nil]; 
    } 
    return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0)); 
} 
+0

你需要知道的漂浮在字節表示。這些數據來自哪裏?數據源或協議是否有規範或類似文檔? –

+0

@KenThomases它來自Java的DataOutputStream類。我試圖通過ios讀取它。 – NJGUY

回答

1

[data getBytes:&myFloat range:NSMakeRange(locationWhereFloatStarts, sizeof(float)]應該做的伎倆。

+0

我試過了,我認爲它需要轉換成大端 – NJGUY

1

鑑於數據來自DataOutputStreamwriteFloat()方法,那麼記錄該文件以使用Float.floatToIntBits()來創建整數表示。 intBitsToFloat()更多文件如何解釋該表示。

我不知道這是否是同樣的事情,但xdr API看起來像它可能搞定表示。在man page的學分是指Sun Microsystems的標準/規範,所以它很可能它與Java有關。

因此,它可能工作做這樣的事情:

// At top of file: 
#include <rpc/types.h> 
#include <rpc/xdr.h> 

// In some function or method: 
XDR xdr; 
xdrmem_create(&xdr, (char*)data.bytes + offset, data.length - offset, XDR_DECODE); 
float f; 
if (!xdr_float(&xdr, &f)) 
    /* handle error */; 
xdr_destroy(&xdr); 

如果數據由外部數據表示一個整體流,那麼你會從它提取項目的全部任務創建一個XDR流,並在創建和銷燬它之間使用許多xdr_...()調用來提取所有項目。

2

OSByteOrder.h包含功能用於讀,寫,和轉換整數數據。

您可以使用OSSwapBigToHostInt32()到大端整數位轉換爲原生表示,然後複製到一個浮動:

NSData* data = [NSData dataWithContentsOfFile:@"/tmp/java/test.dat"]; 

    int32_t bytes; 
    [data getBytes:&bytes length:sizeof(bytes)]; 

    bytes = OSSwapBigToHostInt32(bytes); 

    float number; 
    memcpy(&number, &bytes, sizeof(bytes)); 

    NSLog(@"Float %f", number);