Как я могу reinterpter_cast вектор к int? - PullRequest
2 голосов
/ 15 февраля 2020

У меня есть вектор из четырех байтов: std::vector<int8_t> src = { 0x0, 0x0, 0x27, 0x10 };, который в шестнадцатеричном виде равен 10000. (0x2710)

Как мне набрать его в int32_t, чтобы я получил 10.000, используя reinterpret_cast?

Это легко сделать с помощью битовых сдвигов, например:

(int32_t)((src[offset] << 24) | (src[offset+ 1] << 16) | (src[offset+ 2] << 8) | (src[offset+ 3]));

но насколько я знаю, как работает reinterpret_cast, это можно использовать здесь в лучшем виде, но я не могу понять, как именно это сделать в самом коде.

reinterpret_cast<int32_t*>(&0x00002710);

ps: это не только для int32_t или около того, это может быть истолковано как угодно я хотел бы sh. В этом все дело.

Ответы [ 2 ]

1 голос
/ 17 февраля 2020

Это невозможно; попытка будет неопределенным поведением из-за строгого нарушения псевдонимов. К массиву int8_t нельзя получить доступ как к какому-либо другому типу (за исключением этого указанного c случаев, перечисленных в правиле, таких как uint8_t).

Использование битовых сдвигов или memcpy - правильные способы (как и идея ответа SM)

1 голос
/ 15 февраля 2020
#include <iostream>
#include <numeric>
#include <vector>

int main() {
  std::vector<int8_t> src = { 0x0, 0x0, 0x27, 0x10 };
  std::cout <<
    std::accumulate(src.begin(), src.end(),  // or src.begin() + sizeof(int32_t)
       0, [](const uint32_t &a, const uint8_t &b){ return a * 256 + b; });
  std::cout << std::endl;
  return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...