Home > OS >  Append to String a Signed Int (Converted to Bytes) in Big Endian
Append to String a Signed Int (Converted to Bytes) in Big Endian

Time:05-13

I have a 4 byte integer (signed), and (i) I want to reverse the byte order, (ii) I want to store the bytes (i.e. the 4 bytes) as bytes of the string. I am working in C . In order to reverse the byte order in Big Endian, I was using the ntohl, but I cannot use that due the fact that my numbers can be also negative.

Example:

int32_t a = -123456;
string s;
s.append(reinterpret_cast<char*>(reinterpret_cast<void*>(&a))); // int to byte

Further, when I am appending these data, it seems that I am appending 8 bytes instead of 4, why? I need to use the append (I cannot use memcpy or something else). Do you have any suggestion?

CodePudding user response:

I was using the ntohl, but I cannot use that due the fact that my numbers can be also negative.

It's unclear why you think that negative number would be a problem. It's fine to convert negative numbers with ntohl.

s.append(reinterpret_cast<char*>(reinterpret_cast<void*>(&a)));

std::string::append(char*) requires that the argument points to a null terminated string. An integer is not null terminated (unless it happens to contain a byte that incidentally represents a null terminator character). As a result of violating this requirement, the behaviour of the program is undefined.

Do you have any suggestion?

To fix this bug, you can use the std::string::append(char*, size_type) overload instead:

s.append(reinterpret_cast<char*>(&a), sizeof a);
reinterpret_cast<char*>(reinterpret_cast<void*>

The inner cast to void* is redundant. It makes no difference.

  •  Tags:  
  • c
  • Related