2015-02-09 3 views
1

Я спросил здесь, как преобразовать 4 символов в целое число здесь: stackoverflow linkHex * символ из числа Int

Это работает, но теперь мне нужно сделать то же самое, но в обратном направлении. Я хочу сделать 4 символа из одного int. Потому что я не понимаю полного смещения битов и использования операторов OR и AND на практике, поэтому я попытался решить мою проблему с помощью глупых решений, таких как преобразование сначала int в Hex String, а затем в char и т. Д. Может ли кто-нибудь помочь мне здесь с хорошим решением, пожалуйста? Извините за мой английский.

+0

Если ваша система малозначительная, вы, вероятно, можете уйти с memcpy'ing один в другой. Не цитируйте меня на этом! –

+0

Будет ли «союз» соответствовать вашему счету? – DevSolar

+0

Отправьте свой код или, по крайней мере, то, что вы пытаетесь сделать с псевдокодом. –

ответ

1

мне нужно сделать то же самое, но в обратном направлении. Я хочу сделать 4 символа из одного int.

Просто выполните операции в обратном порядке. Сдвиг вправо вместо левых и масок после смены вместо раньше:

char bytes[4]; 
long number = 0x00000190L; // int may be only 2 bytes on some implementations 
for(int i = 0; i < 4; i++) { 
    bytes[i] = (number >> (8 * i)) & 0xFFL; 
} 

Если ваше намерение, чтобы получить шестигранную строку вместо (как следует из названия, но не является обратным связанным вопросом), то проще всего использовать std::hex и поток.

+0

Большое спасибо, это то, что мне нужно :) Работа! – TomCrow

2

Здесь может быть приемлемое решение, манипулирующее указателями. Отличный учебник о указателях можно найти here

int main() 
    { 
     int test32 = 0 ; 
     int* ptest32 = &test32; 

     char* p1st8bits = (char*) ptest32; 
     char* p2nd8bits = p1st8bits + 8; 
     char* p3nd8bits = p1st8bits + 16; 
     char* p4nd8bits = p1st8bits + 24; 

     std::cout <<"first 8 bits: " << *p1st8bits << "\n" ; 
     std::cout <<"second 8 bits: " << *p2nd8bits << "\n" ; 
     std::cout <<"third 8 bits: " << *p3nd8bits << "\n" ; 
     std::cout <<"fourth 8 bits: " << *p4nd8bits << "\n" ; 
    } 
+0

Это довольно умно, спасибо за это. Но для меня не работало очень хорошо. Но я был только плохой. – TomCrow

+1

Это хорошее решение, но будьте осторожны, потому что вы можете получить нарушение доступа, если вы не смещаете указатель правильно. битное смещение в этой перспективе более безопасно. – iedoc

+0

Ну, это зависит. Вероятность того, что у вас есть нарушение прав доступа при использовании указателей и ошибка (например, доступ к 33-му биту), можно быстро свести к нулю, проверив код и убедившись, что получены правильные символы. Если он работает один раз, он всегда будет работать. Bitshifting может вводить в заблуждение с помощью знаков и поведения разных компиляторов. Я бы сказал, что оба решения великолепны. – rdavb

1

Попробуйте это:

const unsigned int value = 0x12345678; 
std::ostringstream hex_stream; 
hex_stream << hex << value; 

выше фрагмент преобразует значение в шестнадцатеричной строку. Следующий фрагмент будет печатать символы по одному в каждой строке.

std::string chars_as_hex = hex_stream.str(); 
for (i = 0; i < chars_as_hex.length(); ++i) 
{ 
    std::cout << chars_as_hex[i] << std::endl; 
} 
1

использование бит сдвига:

#include <string> 
#include <iostream> 


void main(void* args) 
{ 
    // 4 byte integer 
    unsigned int charInteger = 0; 

    // 4 characters 
    unsigned char c1 = 'a'; 
    unsigned char c2 = 'b'; 
    unsigned char c3 = 'c'; 
    unsigned char c4 = 'd'; 

    // put each character above into each byte of a 4 byte integer 
    charInteger = (c1 & 0xFF) 
     | ((c2 & 0xFF) << 8) 
     | ((c3 & 0xFF) << 16) 
     | ((c4 & 0xFF) << 24); 

    std::cout << "charInteger = " << charInteger << "\n"; 

    // get each byte of the integer 
    unsigned int i1 = charInteger & 0xff; // first byte 
    unsigned int i2 = (charInteger >> 8) & 0xff; // second byte 
    unsigned int i3 = (charInteger >> 16) & 0xff; // third byte 
    unsigned int i4 = (charInteger >> 24) & 0xff; // fourth byte 

    // display each byte of charInteger as characters 
    std::cout << char(i1) << "\n"; 
    std::cout << char(i2) << "\n"; 
    std::cout << char(i3) << "\n"; 
    std::cout << char(i4) << "\n"; 

    std::string h; 
    std::cin >> h; 
} 
+0

Я должен был просто преобразовать каждый байт обратно в символы, вместо ints, затем отбрасывая их на символы при их отображении, но я подумал, что было легче видеть, что вы получаете значение каждого байта целого числа – iedoc

+0

Спасибо за ответ с объяснение. Я получил его сейчас! – TomCrow

0

Это должно сделать работу:

const char* chars = (const char*)&number; 

И теперь вы можете получить доступ к чарсы, поскольку они находятся в массиве:

chars[0], chars[1], chars[2], chars[3] 

Same вы действительно можете сделать в обратном направлении:

char chars[4]; 
// write each char in to array 
int *pnumber = (int*)chars; 
// now you can read the number: 
int number = (*pnumber); 

Порядок здесь важен, и это зависит от эндианны вашей системы.

Смежные вопросы