Home > Enterprise >  What does vector<unsigned char> vchTmp(pend-pbegin 1, 0); mean?
What does vector<unsigned char> vchTmp(pend-pbegin 1, 0); mean?

Time:02-27

What does

vector<unsigned char> vchTmp(pend-pbegin 1, 0);

mean?

This line is taken from the base58.h source code from the first commit of bitcoin source code. source here

click on base58.h

line 27

I cannot understand what does it mean.

Thanks Massimo

CodePudding user response:

inline string EncodeBase58(const unsigned char* pbegin, const unsigned char* pend)
{
    // Convert big endian data to little endian
    // Extra zero at the end make sure bignum will interpret as a positive number
    vector<unsigned char> vchTmp(pend-pbegin 1, 0);
    reverse_copy(pbegin, pend, vchTmp.begin());
    // ...

This means that the function takes a begin and end iterator defined as const unsigned char*. It then creates a vector<unsigned char> with the size of the distance between pbegin and pend and adds one extra unsigned char ( 1).

Apparently that is to make "bignum" (a library dealing with big numbers) always interpret it as a positive number. The 0 is copied into all unsigned char elements in the vector. 0 is the default value here so it's unnecessary.

It would probably be clearer to do:

vector<unsigned char> vchTmp(std::distance(pbegin, pend)   1);

The following reverse_copy puts the data [pbegin, pend) into vchTmp in reverse order.

reverse_copy(pbegin, pend, vchTmp.begin());

If you'd call the function like this:

unsigned char arr[] = {'B','a','r'};
EncodeBase58(std::begin(arr), std::end(arr));

Then vchTmp would contain 4 elements, in this order: 'r', 'a', 'B', 0 (except they are unsigned char, not char). The last 0 is the the extra 0 that was added by creating the vector with 1 above.

CodePudding user response:

The statement creates a vector named vchTmp with elements of type unsigned char and with pend - pbegin 1 number of elements. Moreover all of those elements are initialized with the integer 0.

The statement uses constructor 3 listed here:

vector( size_type count,
         const T& value,
         const Allocator& alloc = Allocator()); 

Note that the char(and unsigned char) data type is an integral type, meaning the underlying value is stored as an integer. Now, the integer stored by a char(and unsigned char) variable is intepreted as an ASCII character. And since they've specified the integer 0 which corresponds to the NUL character '\0' in the ASCII table, this effectively means that the statement creates a vector named vchTmp that contains pend - pbegin 1 NUL characters.

For example,

unsigned char arr[]   = "stackoverflow";
unsigned char* pbegin = arr;
unsigned char*pend    = arr   3;
    
std::vector<unsigned char> vchTmp(pend-pbegin 1, 0); //vchTmp contains 4 NUL characters

CodePudding user response:

Let's take a simple example:

std::vector<unsigned char> vec(5, 72);

This means declaring a std::vector named vec of the type unsigned char, which has 5 elements, and each of those 5 elements contains the value 72, which when translated to char (as the type of the vector is unsigned char), means 'H'. So the values in vec are:

{ 'H', 'H', 'H', 'H', 'H' }

Thus, the above line of code can also be written as:

std::vector<unsigned char> vec(5, 'H');
  • Related