2016-03-08 164 views
1

的dataFile.bin是具有6個字節記錄的二進制文件。第3個 字節每條記錄都包含緯度和最後3個字節包含 經度。每24位值表示弧度乘以 0X1FFFFF轉換爲32位整數24位整數(2S補碼)在C++

這是我一直在工作的任務。我還沒有做過C++中的年,所以它把我方式的時間比我想象的還要-_-。圍繞谷歌搜索後,我看到這個algorthim這對我有意義。

int interpret24bitAsInt32(byte[] byteArray) {  
int newInt = ( 
    ((0xFF & byteArray[0]) << 16) | 
    ((0xFF & byteArray[1]) << 8) | 
    (0xFF & byteArray[2]) 
    ); 
if ((newInt & 0x00800000) > 0) { 
    newInt |= 0xFF000000; 
} else { 
    newInt &= 0x00FFFFFF; 
} 
return newInt; 
} 

的問題是語法問題我限制被其他傢伙編程這種方式工作。我不瞭解如何將CHAR「數據」存儲到INT中。如果「數據」是一個數組,它會更有意義嗎?由於它接收24個存儲在BYTE中的信息整數。

double BinaryFile::from24bitToDouble(char *data) { 
    int32_t iValue; 

    // **************************** 
    // Start code implementation 
    // Task: Fill iValue with the 24bit integer located at data. 
    // The first byte is the LSB. 
    // **************************** 
//iValue += 
    // **************************** 
    // End code implementation 
    // **************************** 
    return static_cast<double>(iValue)/FACTOR; 
} 

bool BinaryFile::readNext(DataRecord &record) 
{ 
    const size_t RECORD_SIZE = 6; 
    char buffer[RECORD_SIZE]; 
    m_ifs.read(buffer,RECORD_SIZE); 
    if (m_ifs) { 
     record.latitude = toDegrees(from24bitToDouble(&buffer[0])); 
     record.longitude = toDegrees(from24bitToDouble(&buffer[3])); 
     return true; 
    } 
    return false; 
} 

double BinaryFile::toDegrees(double radians) const 
{ 
    static const double PI = 3.1415926535897932384626433832795; 
    return radians * 180.0/PI; 
} 

我明白任何幫助,甚至如果你不理解的線索或提示將幫助我很多提示。我只需要與某人交談。

回答

5

我不理解我怎麼能CHAR「數據」存儲到INT。

由於char是一種數字類型,所以將它們組合成一個單一的int沒有問題。

由於信息接收其24點的整數存儲到BYTE

它是24位,而不是字節,因此只有三個需要被合併整數值。

產生相同的結果,而無需使用條件語句更簡單的方法如下:

int interpret24bitAsInt32(byte[] byteArray) {  
    return ( 
     (byteArray[0] << 24) 
    | (byteArray[1] << 16) 
    | (byteArray[2] << 8) 
    ) >> 8; 
} 

的想法是作爲輸入提供的三個字節存儲到三個字節的四個字節的int,然後由一個字節移位下來。這樣程序會自動簽名擴展你的號碼,避免條件執行。

注意:此代碼不可移植,因爲它假定爲32位整數大小。爲了使便攜使用<cstdint>類型:

int32_t interpret24bitAsInt32(int8_t[] byteArray) { 
    return ( 
     (byteArray[0] << 24) 
    | (byteArray[1] << 16) 
    | (byteArray[2] << 8) 
    ) >> 8; 
} 

它還假定的24位數字的最顯著字節存儲在byteArray初始元素,然後是中間單元,最後至少顯著字節。

+1

@SergeyA哎呀,我確實複製粘貼超過了必要的。謝謝! – dasblinkenlight

0

當無符號字符澆鑄爲int高階位用0填充的

當符號字符被澆鑄的鑄造int,則符號位被延長。 即:

int x; 
char y; 
unsigned char z; 
y=0xFF 
z=0xFF 
x=y; 
/*x will be 0xFFFFFFFF*/ 
x=z; 
/*x will be 0x000000FF*/ 

所以,你的算法,使用0xFF的作爲掩模,移除C」符號擴展,即

0xFF == 0x000000FF 
0xABCDEF10 & 0x000000FF == 0x00000010 

然後使用移位和邏輯ANDS把位各得其所。

最後檢查最高有效位(newInt & 0x00800000) > 0以決定是否用0或1完成最高字節。

相關問題