Преобразование int в 2-байтовое шестнадцатеричное значение в C - PullRequest
18 голосов
/ 03 ноября 2010

Мне нужно преобразовать int в 2-байтовое шестнадцатеричное значение для сохранения в массиве char в C. Как я могу это сделать?

Ответы [ 15 ]

0 голосов
/ 06 июня 2014

Эта функция работает как шарм.

void WORD2WBYTE(BYTE WBYTE[2], WORD Value) { 
    BYTE tmpByte[2]; 
    // Converts a value from word to word byte ----
    memcpy(tmpByte, (BYTE*) & Value, 2); 
    WBYTE[1] = tmpByte[0]; 
    WBYTE[0] = tmpByte[1]; 
} 

со следующим:

typedef unsigned char   BYTE; 
typedef unsigned short  WORD;

Пример использования:

мы хотим добиться этого:

integer = 92
byte array in hex:
a[0] = 0x00;
a[1] = 0x5c;

unsigned char _byteHex[2];
WORD2WBYTE(_byteHex, 92);
0 голосов
/ 03 ноября 2010

Вот грубый способ сделать это. Если мы не можем доверять последовательному кодированию значений ascii, мы просто создаем отображение шестнадцатеричных значений в char. Вероятно, можно оптимизировать, привести в порядок и сделать красивее. Также предполагается, что мы смотрим только на захват последних 32 бит == 4 шестнадцатеричных символа.

#include <stdlib.h>
#include <stdio.h>

#define BUFLEN 5

int main(int argc, char* argv[])
{
  int n, i, cn;
  char c, buf[5];
  char hexmap[17] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','.'};

  for(i=0;i<BUFLEN;i++)
    buf[i]=0;

  if(argc<2)
  {
    printf("usage: %s <int>\n", argv[0]);
    return 1;
  }
  n = atoi(argv[1]);
  i = 0;
  printf("n: %d\n", n);

  for(i=0; i<4; i++)
  {
    cn = (n>>4*i) & 0xF;
    c  = (cn>15) ? hexmap[16] : hexmap[cn];
    printf("cn: %d, c: %c\n", cn, c);

    buf[3-i] = (cn>15) ? hexmap[16] : hexmap[cn];
  }
  buf[4] = '\0'; // null terminate it

  printf("buf: %s\n", buf);
  return 0;
}
0 голосов
/ 03 ноября 2010
unsigned int hex16 = ((unsigned int) input_int) & 0xFFFF;

input_int - это число, которое вы хотите конвертировать.hex16 будет иметь младшие 2 байта input_int.Если вы хотите распечатать его на консоли, используйте %x в качестве спецификатора формата вместо %d, и он будет напечатан в шестнадцатеричном формате.

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

Большинство из этих ответов великолепны, я хотел бы добавить одну вещь: вы можете использовать sizeof для безопасного резервирования правильного количества байтов.Каждый байт может содержать до двух шестнадцатеричных цифр (255 -> ff), поэтому это два символа на байт.В этом примере я добавляю два символа для префикса '0x' и один символ для конечного NUL.

int bar; 
// ...
char foo[sizeof(bar) * 2 + 3];
sprintf(foo, "0x%x", bar);
0 голосов
/ 03 ноября 2010

Возможно, попробуйте что-то вроде этого:

void IntToHex(int value, char* buffer) {
  int a = value&16;
  int b = (value>>4)&16;
  buffer[0] = (a<10)?'0'+a:'A'-(a-10);
  buffer[1] = (b<10)?'0'+b:'A'-(b-10);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...