开发者

Convert array of 8 bytes to signed long in C++

开发者 https://www.devze.com 2023-01-24 13:33 出处:网络
I have an array of 8 bytes and I\'m trying to convert it to a signed long in C++, and can\'t seem to figure it out.From what I could tell long ints are only 4 bytes, can anybody provide some informati

I have an array of 8 bytes and I'm trying to convert it to a signed long in C++, and can't seem to figure it out. From what I could tell long ints are only 4 bytes, can anybody provide some information on this? Is it 开发者_如何学JAVAgoing to matter if it is 32 or 64 bit?


You probably should use a int64_t which is guaranteeed to be 8 bytes long.

You don't state how your data is represented (its endianness) into your array but you might use reinterpret_cast<> or even better: use shift operations to "build" your integer.

Something like:

unsigned char array[8] = { /* Some values here */ };
uint64_t value = 
  static_cast<uint64_t>(array[0]) |
  static_cast<uint64_t>(array[1]) << 8 |
  static_cast<uint64_t>(array[2]) << 16 |
  static_cast<uint64_t>(array[3]) << 24 |
  static_cast<uint64_t>(array[4]) << 32 |
  static_cast<uint64_t>(array[5]) << 40 |
  static_cast<uint64_t>(array[6]) << 48 |
  static_cast<uint64_t>(array[7]) << 56;


Another way of conversion between data types, which I find convenient in some cases, is to use the union data type, which allows you to access the same memory portion as different data types. Of course all other remarks regarding endianness, size of data-types etc. still hold.

For example:

union bytes {
    unsigned char c[8];
    uint64_t l;
} myb;
myb.c[0] = 0;
myb.c[1] = 1;
myb.c[2] = 0;
myb.c[3] = 0;
myb.c[4] = 0;
myb.c[5] = 0;
myb.c[6] = 0;
myb.c[7] = 0;
cout << "value of myb.l: " << myb.l << "\n";


Why not just something like the following?

uint8_t start_arr[8] = {0,1,2,3,4,5,6,7};
uint64_t val = (uint64_t)(*(uint64_t*)&start_arr[0]);
std::cout << std::hex << val << std::endl;


Only C99 has types guaranteed to hold 64 bits of information - long long and int*64_t. For C++, you should look for a BigInt class/library. Or, as has been suggested, roll your own class using two longs.


Some long integers are 8 bytes, some are 4. The 8 byte variant usually exists only on 64-bit systems. Check this page if you want to get an idea.

Of course, we don't know what it is in your case, so you'd have to post more details.

To be on the safe side, you could decide to put the 8 bytes into 2 long integers anyway. That way, it will always work. In the worst case you'd be wasting half your storage space.

0

精彩评论

暂无评论...
验证码 换一张
取 消