Bitcoin-Core

一直在閱讀比特幣原始碼,但不確定這部分 Serialize.h 做了什麼

  • July 14, 2017

我決定通過首先閱讀比特幣的整個 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,它將退出並將數組的反向寫入流。

我不明白的是:

  1. 數組的大小有什麼意義?
  2. 為什麼是按位運算?
  3. 為什麼要以相反的順序將數組寫入流?

使用的編碼在每個輸出字節中適合 7 位數據。因此,要計算出您將產生的輸出字節數,您需要將輸入的位數除以 7(因為 7 位輸入適合每個輸出字節),向上取整。

所以,sizeof(n)是輸出的字節數。乘以 8 得到輸入的位數。我們除以 7 以獲得適合這麼多位輸入所需的輸出字節數。

但整數除法向下舍入。要除以 7 但向上取整,我們在除之前將數字加 6。這使它四捨五入。

引用自:https://bitcoin.stackexchange.com/questions/56663