2013-05-06 3 views
0

У меня есть функция, которая позволяет мне отделить значение INT в 2 байта (например: INT "123123" приводит к E0F3; highByte= 0xF3 и lowByte=0xE0)Унификация 2 байта Int

с помощью этого:

void int2bytes(unsigned char dest[2],int val){ 
      int hByte=0; 
      int lByte=0; 

      hByte=val&0XFF; 
      lByte=val>>8; 

      dest[0]= (char)hByte; 
      dest[1]= (char)lByte; 
      } 

Мой вопрос:

Как конвертировать (унифицировать) эти 2 байта в один INT равен «123123»?

ответ

3

Чтобы выполнить обратное вашей функции int2bytes вы просто сделать это:

int val = (lByte << 8) | hByte; 

Хотя, я думаю, что у вас есть имена ваших переменных обратно к фронту. Я бы назвал val&0xff младшим байтом и val >> 8 старшим байт.


Вы также ошибаетесь, полагая, что вы можете поместить 123123 на 2 байта. Помните, что 2^16 - 65536.

У меня есть функция, которая позволяет мне отделить значение INT на 2 байта (например: ИНТ "123123" приводит к E0F3; highByte = 0xF3 и LowByte = 0xE0)

Ну, E0F3 представленных в десятичном значении равно 57587. Какое значение вы сообщаете в комментарии к моему ответу.

В настоящее время 123123 представлено в шестнадцатеричном формате: 0x1E0F3, и для хранения этого значения требуется как минимум три байта.

+0

, который возвращает мне значение «57578» вместо «123123». спасибо в любом случае – Joaquin

+1

Мой код правильно меняет ваш код. Проблема в том, что 123123 не вписывается в два байта. "В любом случае, спасибо". –

+0

Давид Хеффернан прав, 123123! = 0xE0F3. 123123 = 0x1E0F3 –

0

Попробуйте

(dest[1] << 8) & dest[0] 

ИМХО hByte и lByte поменялись местами ... И что более 123123 не является значением два байта. Int подписан, поэтому в двух байтах максимальное значение равно 32767, но int (обычно) составляет 4 байта.

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

Пример кода использовать союз:

#include <iostream> 
using std::cout; 
using std::hex; 
using std::dec; 
using std::endl; 

int main() { 
    union int2bytes { 
     unsigned char byte[sizeof(int)]; 
     int val; 
    }; 

    int2bytes i; 
    // Convert int to byte 
    i.val = 123123; 
    cout << i.val << " : " << hex << i.val << dec << endl; 
    for (int j = 0; j < sizeof(int); ++j) 
     cout << "Byte#" << j << " : " << hex << (int)i.byte[j] << dec << endl; 

    // Convert byte to int 
    i.byte[1]--; 
    cout << i.val << " : " << hex << i.val << dec << endl; 
} 

Выход:

123123 : 1e0f3 
Byte#0 : f3 
Byte#1 : e0 
Byte#2 : 1 
Byte#3 : 0 
122867 : 1dff3 

Союз может быть улучшен немного

union int2bytes { 
    unsigned char byte[sizeof(int)]; 
    int val; 
    int2bytes (const int2bytes& i = 0) : val(i.val) {}; 
    int2bytes (int i) : val(i) {}; 
}; 

В настоящее время эти работы

int2bytes i = 123123; 
int2bytes j; // j.val == 0 
int2bytes k = i; 
j = i; 
Смежные вопросы