Преобразовать массив из 8 байтов в подписанный длинный в C ++ - PullRequest
2 голосов
/ 10 ноября 2010

У меня есть массив из 8 байтов, и я пытаюсь преобразовать его в длинную подпись в C ++, и я не могу понять это.Из того, что я могу сказать, длинные целые числа - только 4 байта, кто-нибудь может предоставить некоторую информацию об этом?Это будет иметь значение, если это 32 или 64 бит?

Ответы [ 5 ]

8 голосов
/ 10 ноября 2010

Вы, вероятно, должны использовать int64_t, который гарантированно будет иметь длину 8 байт.

Вы не указываете, как ваши данные представлены (их порядковые номера) в вашем массиве, но вы можете использовать reinterpret_cast<> или даже лучше: используйте операции сдвига, чтобы "построить" ваше целое число.

Что-то вроде:

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;
2 голосов
/ 10 ноября 2010

Другим способом преобразования между типами данных, который я считаю удобным в некоторых случаях, является использование типа данных объединения, который позволяет вам обращаться к той же части памяти, что и к различным типам данных. Конечно, все остальные замечания, касающиеся порядка байтов, размера типов данных и т. Д., Остаются в силе.

Например:

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";
1 голос
/ 23 октября 2018

Почему бы просто что-то вроде следующего?

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;
0 голосов
/ 10 ноября 2010

Только C99 имеет типы, которые гарантированно содержат 64 бита информации - long long и int*64_t.Для C ++ вы должны искать класс / библиотеку BigInt.Или, как было предложено, бросьте свой собственный класс, используя два long s.

0 голосов
/ 10 ноября 2010

Некоторые длинные целые числа составляют 8 байтов, некоторые - 4. Вариант 8 байтов обычно существует только в 64-битных системах. Отметьте эту страницу , если хотите получить представление.

Конечно, мы не знаем, что это такое в вашем случае, поэтому вам придется публиковать более подробную информацию.

Чтобы быть в безопасности, вы все равно можете решить поместить 8 байтов в 2 длинных целых числа. Таким образом, это всегда будет работать. В худшем случае вы потеряете половину своего пространства для хранения.

...