我知道C++ 11有一些標準的工具可以從未對齊的內存中獲得整數值。這樣的事情怎麼會以更標準的方式寫出來呢?如何以標準方式從未對齊的內存中獲取值?
template <class R>
inline R get_unaligned_le(const unsigned char p[], const std::size_t s) {
R r = 0;
for (std::size_t i = 0; i < s; i++)
r |= (*p++ & 0xff) << (i * 8); // take the first 8-bits of the char
return r;
}
要利用存儲在豆蔻-endian順序的值,然後你可以寫:
uint_least16_t value1 = get_unaligned_le<uint_least16_t > (&buffer[0], 2);
uint_least32_t value2 = get_unaligned_le<uint_least32_t > (&buffer[2], 4);
謝謝。基本上有8位長的無符號字符正在從設備寫入主機,設備總是將它們寫入小端順序(我已經解決了我的問題)現在還有一個不明確的問題是:如果主機arch中的字節長度超過8位,會發生什麼情況?舉個例子,假設它們是16位長要寫兩個8位uchars,設備是否需要消耗兩個字節主機(只有第一個8位有意義)還是設備只使用一個字節? – Martin 2012-08-02 09:58:30
@Martin這取決於編寫代碼的人是誰,但是在邏輯上,對於在機器外部可見的任何東西,我期望只使用字節的低8位。 (如果你通過移位和屏蔽來寫入int,那麼這會自動從代碼中跳出來,如果編碼者認爲他會聰明並使用memcpy,那麼最終可能會丟失每一個第8位輸出)。 – 2012-08-02 10:05:08