2013-01-24 51 views
2

我目前面臨一個我不知道如何避免它的問題。
我嘗試處理可以是大端或小端的數據。這不是一個真正的問題,因爲它總是以一個頭文件開始,所以我可以檢查我必須使用哪種endian模式,但是在解碼值時,有一些操作我不知道如何實現大端數據。
該代碼在nVidia Tegra(基於ARMv7架構的Cortex-A9)上運行,該代碼是小端(或以小端模式運行),但有時會得到大端數據。
上的數據大多數手術是不是一個真正的問題,但我不知道如何獲得另外的權利..在小端機器上添加兩個大端值

Example: D5 1B EE 96 |  96 EE 1B D5 
     + AC 84 F4 D5 | + D5 F4 84 AC 
     = 1 81 A0 E3 6B | = 1 6C E2 A0 81 

正如你可以看到,大部分字節都已經在結果正確的,但有些則不是。它們與預期結果相差+1或-1,因爲加法總是從右到左(小端機器),所以我們把進位(如果有的話)放在左邊。
在這個小端機上的大端添加的情況下,我將不得不從左到右添加進位(如果有的話)。

我現在的問題是,是否有可能(可能使用處理器的特殊說明?)以獲得正確的結果?也許我可以對結果做進一步的操作,以擺脫這些「更便宜」的+ 1/-1差異,而不是恢復兩個操作數以及結果?

最好的問候, 托比亞斯

+3

我認爲你應該在需要時真的交換字節,所以當輸入的數據有不同的endiannes比你的機器。 – piokuc

+0

您期望的結果是什麼?你想保留大的字節序,還是想轉換成小字節序? – gaborsch

+0

只有當字節被交換爲PRIOR以後才能正確添加(如果它們是以big endian的形式進入你的小端機器的話)。只有在絕對不需要從字節到字節的極低概率情況下,這種工作在加法之前不進行字節交換。 – trumpetlicks

回答

4

做,這是簡單的數字轉換成一個正確的順序,然後進行計算,然後(如果需要)再轉換回最合乎邏輯的方式。

你當然可以用一個循環來完成逐字節的向後計算並處理進位 - 但它更復雜,而且我相當肯定它也不會更快,因爲還有更多條件和處理器在「byteswapping」方面相當不錯。

您應該可以使用ntohlhtons網絡功能來轉換數字。

事情是這樣的:

int add_big_endian(int a, int b) 
{ 
    x = ntohl(a); 
    y = ntohl(b); 

    z = x + y; 

    return htonl(z); 
} 
0

你有兩個選擇:你可以寫兩套代碼,每個字節順序,並試圖跟蹤發生了什麼地方,或者你可以使用一個內部表示並適當地轉換傳入和傳出的值。後者要簡單得多。