С++: преобразовать беззнаковый длинный int в вектор необработанные данные

Мне нужно преобразовать long int x = 0x9c758d0f в vector<*******> y = 9c 75 8d 0f</*******>.

Я использовал:

std::stringsteam ss;
ss << std::hex << x;

std::string s = ss.str();

std::vector<*******> y;
String2Vector(s,y);

 void String2Vector(std::string& in, std::vector<*******>& output) 
 {
 std::vector<*******> out;
 size_t len = in.length();

 for(size_t i = 0; i < len; i += 1) 
 {
 std::stringstream strm(in.substr(i, 1));
 ******* x;
 strm >>std::hex>> x;
 out.push_back(x);
 }
 output = out;
 }
</*******></*******></*******>

Однако vector сохранил номер ASCII вместо шестнадцатеричного значения.

Что я должен сделать, чтобы преобразовать long int в исходный вектор данных? Это многоплатформенный проект, поэтому я не хочу касаться memcpy() и т.д.

Обновление: Довольно уверен, что что-то пошло не так:

long int x = 0x9c758d0f;
std::vector<*******> v;
v.reserve(sizeof(x));
for (size_t i = 0; i < sizeof(x); ++i) {
 v.push_back(x & 0xFF);
 x = (x>>8);
}
PrintOutVector(v);

void PrintOutVector(std::vector<*******>& in)
 {
 std::cout << "Vector Contains: ";
 for(std::vector<*******>::iterator i=in.begin(); i != in.end(); ++i)
 std::cout << std::hex << *i ;
 std::cout << "\n";
 }
</*******></*******></*******>

выход ▒C▒▒h4

Решение: Much thanx to @WhozCraig @Anton Savin

long int x = 0x9c758d0f;
std::vector<*******> v;
v.reserve(sizeof(x));
for (size_t i = 0; i < sizeof(x); ++i) {
 v.push_back(x & 0xFF);
 x = (x>>8);
}
PrintOutVector(v);

void PrintOutVector(std::vector<*******>& in)
 {
 std::cout << "Vector Contains: ";
 for(std::vector<*******>::iterator i=in.begin(); i != in.end(); ++i)
 std::cout << std::hex << static_cast<unsigned int="">(*i)
 std::cout << "\n";
 }
</unsigned></*******></*******></*******>
3 ответа

Вот решение, которое обеспечивает одинаковые результаты независимо от порядка байтов:

long int x = 0x9c758d0f;
std::vector<*******> v;
v.reserve(sizeof(x));
for (size_t i = 0; i < sizeof(x); ++i) {
 v.push_back(x & 0xFF);
 x >>= 8;
}
</*******>


long int x = 0x9c758d0f;
const ******** begin = reinterpret_cast<const ********="">(&x);
const ******** end = begin + sizeof(x);
std::vector<*******> v(begin, end);
</*******></const>

Обратите внимание, что порядок зависит от того, как ваша система упорядочивает байты (большие или конечные) в long. Вы можете справиться с этим, сначала переупорядочивая байты в big-endian с помощью функции, такой как htonl(), за исключением того, что для int и нет кросс-платформенного один long поэтому вам придется подумать о том, что делать там, если вы заботитесь о порядке байтов.


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

union U{
 long int i;
 ******* uc[4];
};
U u = {0x9c758d0f};
std::vector<*******> ucvec(u.uc, u.uc+4);
printf ("%x:%x:%x:%x\n", ucvec[3], ucvec[2], ucvec[1], ucvec[0]);
</*******>

licensed under cc by-sa 3.0 with attribution.