Bitcoin-Core
一直在閱讀比特幣原始碼,但不確定這部分 Serialize.h 做了什麼
我決定通過首先閱讀比特幣的整個 C++ 實現來了解加密(和 C++)。我對這部分 serialize.h 有疑問
template<typename Stream, typename I> void WriteVarInt(Stream& os, I n) { unsigned char tmp[(sizeof(n)*8+6)/7]; int len=0; while(true) { tmp[len] = (n & 0x7F) | (len ? 0x80 : 0x00); if (n <= 0x7F) break; n = (n >> 7) - 1; len++; } do { ser_writedata8(os, tmp[len]); } while(len--); }
我知道它正在向流中寫入一些變數,但是我不明白
(sizeof(n)*8+6)/7
對於數組大小。然後它進入某個循環,在其中執行按位或按位和循環計數器以及 127 的十六進製表示,以及 128 或 0 的十六進製表示,具體取決於循環計數器是否為 0。
然後,如果數字小於 127,它將退出並將數組的反向寫入流。
我不明白的是:
- 數組的大小有什麼意義?
- 為什麼是按位運算?
- 為什麼要以相反的順序將數組寫入流?
使用的編碼在每個輸出字節中適合 7 位數據。因此,要計算出您將產生的輸出字節數,您需要將輸入的位數除以 7(因為 7 位輸入適合每個輸出字節),向上取整。
所以,
sizeof(n)
是輸出的字節數。乘以 8 得到輸入的位數。我們除以 7 以獲得適合這麼多位輸入所需的輸出字節數。但整數除法向下舍入。要除以 7 但向上取整,我們在除之前將數字加 6。這使它四捨五入。