Endianness
字節序轉換是如何完成的?
這個答案似乎很簡單,但我發現答案不一。這個問題描述了從 little-endian 到 big-endian 十六進製字元串的轉換(反之亦然),即在每個四個字節的切片中切換字節順序,在這裡它被描述為只是一個字元串反轉。兩者在他們的上下文中似乎都是正確的,那麼到底發生了什麼?
一般來說,大端值和小端值之間的轉換完全取決於您儲存這些值的方式,因此您的兩個範例在不同的實現中都可能是正確的。為此,即使在同一個應用程序中,技術也可能會有所不同,因為它更多地取決於輸入數據的格式。
它還取決於您的特定案例如何定義字節序 - 沒有萬能的定義 - 字節序可以指 16、32 或 64 位字中 8 位字節的順序,也可以指順序在更大的上下文中,單個位甚至整個單詞的順序。例如,如果您正在對 16 位字“07F3”進行編碼,並且您對字節序的定義是指一個字中的字節,那麼大字節序將是“07F3”,而小字節序將是“F307”——使用 4-位字節,您最終會得到“07F3”和“3F70”,使用單個位大端將是“0111 1111 0011”(07F3),小端將是“1100 1111 1110”(0CFE)。
然而,一個很好的例子是比特幣的base58.h中的 EncodeBase58() 函式,它使用 char 向量和 C++ 的內置 reverse_copy 函式來反轉向量中元素的順序:
// Convert big endian data to little endian // Extra zero at the end make sure bignum will interpret as a positive number std::vector<unsigned char> vchTmp(pend-pbegin+1, 0); reverse_copy(pbegin, pend, vchTmp.begin());
現在我不是 100% 確定,但我相信傳遞給編碼函式的是值的 UTF-8 編碼字元串表示,所以用你自己的話來說,比特幣的字節序轉換似乎是 - 至少在 Base58 轉換關心 - 只要輸入是 UTF-8 編碼的,它就是一個簡單的字元串反轉。