你可能想看看SO 2032744作爲一個大端到小端問題的例子。
我不確定你使用寄存器意味着什麼,可以解決你的endian-ness問題。我們需要查看代碼才能知道。但是,如果您需要通過不同機器之間的線路傳輸整數值,則需要確保正確處理大小和字節順序。這意味着兩端必須就如何處理它達成一致 - 即使他們實際上以不同的方式做事。
複製的字節數組成Intel平臺上的「長」將從複製同一陣列成「長」在SPARC平臺上產生不同的結果。要通過註冊,您必須使用類似於以下代碼:
void st_uint4(Uint4 l, char *s)
{
s += sizeof(Uint4) - 1;
*s-- = l & 0xFF;
l >>= 8;
*s-- = l & 0xFF;
l >>= 8;
*s-- = l & 0xFF;
l >>= 8;
*s = l & 0xFF;
}
Uint4 ld_uint4(const char *s)
{
int i;
Uint4 j = 0;
for (i = 0; i < 4; i++)
{
j = (j << 8) | (*s++ & 0xFF);
}
return(j);
}
有多種方法可以編寫該代碼。
尋址的評論:
當整個機器的數據處理,你必須非常小心。顯示的兩個函數是相互顛倒的。 'ld_uint4()'函數接受一個字節數組並將其加載到一個4字節的有符號整數中(假設您有一個Uint4的typedef,映射到一個4字節的有符號整數 - uint32_t來自inttypes.h或stdint.h是好打賭)。 st_uint4()函數執行反向操作。此代碼使用big-endian存儲格式(MSB在字節數組中首先使用),但在兩種類型的平臺上都使用相同的代碼(沒有性能優勢 - 也沒有條件編譯,這可能更重要)。你可以編寫代碼來使用little-endian存儲;你可以編寫代碼,以便在一種類型的機器上比其他類型的機器更少受到懲罰。
瞭解磁盤上的數據佈局至關重要 - 仔細定義並以平臺中立的方式進行定義也至關重要。處理(單字節代碼集)字符串很簡單;處理寬字符字符串(UTF-16或UTF-32)就像處理整數一樣 - 如果你願意,你可以使用與上面的代碼類似的代碼(例如,我已經預先打包了這樣的函數 - 我只是複製Uint4版本;我也有SintN函數 - 對於複製的東西,差異並不重要,但對於內存比較,signed和unsigned值的比較技術是不同的)。
處理float和double更棘手 - 儘管如果你可以安全地假設IEEE 754格式,它主要是你面對的一個大端到小端的問題(也許是一些工會的狡猾問題)。我使用的代碼庫與葉/雙浮動平臺相關(這是一個令人討厭的問題,但是可以追溯到IEEE 754之前的日子無處不在),所以我沒有平臺中立的代碼。也要小心路線;英特爾芯片允許未對齊訪問,但其他芯片(SPARC,PowerPC)不支持,或產生大量開銷。這意味着,如果您複製一個4字節的值,則如果您執行簡單複製,則源地址和目標地址必須爲4字節對齊;上面的存儲/加載函數沒有這個問題,可以處理任意的對齊。再次警惕過度優化(過早優化)。
我實際上在做以下操作 字節輸出[somesize]; memset(output,0x00,somesize); memset 我用散列值填充它,然後做一個直接分配的循環。 很長很長的另一個輸出[somesize]; 運行for循環並執行任務。 現在你說這仍然是一個永恆的問題? 我會看看你發給我的是什麼。 – djones2010 2010-01-11 23:40:27
是的,我不完全確定你在說什麼,但我認爲是。 (你可以編輯問題添加一些代碼來演示你在做什麼?) – James 2010-01-12 00:01:53
我可以使用int64_t bswap_64(int64_t x)。我可以得到一個例子,我可以如何使用這個與十六進制值的字節數組? – djones2010 2010-01-12 16:59:37