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

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

Ответы [ 15 ]

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

Если вам разрешено использовать библиотечные функции:

int x = SOME_INTEGER;
char res[5]; /* two bytes of hex = 4 characters, plus NULL terminator */

if (x <= 0xFFFF)
{
    sprintf(&res[0], "%04x", x);
}

Ваше целое число может содержать более четырех шестнадцатеричных цифр данных, поэтому сначала нужно проверить.

Если вам не разрешено использовать библиотечные функции, разделите их на nybbles вручную:

#define TO_HEX(i) (i <= 9 ? '0' + i : 'A' - 10 + i)

int x = SOME_INTEGER;
char res[5];

if (x <= 0xFFFF)
{
    res[0] = TO_HEX(((x & 0xF000) >> 12));   
    res[1] = TO_HEX(((x & 0x0F00) >> 8));
    res[2] = TO_HEX(((x & 0x00F0) >> 4));
    res[3] = TO_HEX((x & 0x000F));
    res[4] = '\0';
}
4 голосов
/ 03 ноября 2010

Предполагая, что int равен 32 битам;

самый простой способ: просто используйте sprintf ()

int intval = /*your value*/
char hexval[5];
sprintf(hexval,"%0x",intval);

Теперь используйте hexval [0] - hexval [3];если вы хотите использовать ее в качестве строки с нулевым символом в конце, добавьте hexval[4]=0;

3 голосов
/ 03 ноября 2010
char s[5];  // 4 chars + '\0'
int x = 4660;
sprintf(s, "%04X", x);

Возможно, вы захотите проверить sprintf() документацию.Будьте осторожны, что этот код не очень безопасен.Если x больше 0xFFFF, конечная строка будет иметь более 4 символов и не будет соответствовать.Чтобы сделать его более безопасным, посмотрите на snprintf().

2 голосов
/ 04 ноября 2010

Выяснил быстрый способ, который я проверил, и он работает.

int value = 11;

array[0] = value >> 8;
array[1] = value & 0xff;

printf("%x%x", array[0], array[1]);

результат:

000B

, что в шестнадцатеричном виде равно 11 *

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

Обычно я бы рекомендовал использовать решения на основе sprintf, рекомендованные другими. Но когда я написал инструмент, который должен был конвертировать миллиарды элементов в гекс, sprintf был слишком медленным. Для этого приложения я использовал массив из 256 элементов, который отображает байты в строки.

Это неполное решение для преобразования 1 байта, не забудьте добавить проверку границ и убедиться, что массив является статическим или глобальным, его повторное создание для каждой проверки может снизить производительность.

static const char hexvals[][3]= {"00", "01", "02", ... "FD", "FE", "FF"};
const char *byteStr = hexvals[number];
1 голос
/ 09 ноября 2015
void intToHex(int intnumber, char *txt)
{    
    unsigned char _s4='0';
    char i=4;
    //intnumber=0xffff;

    do {
        i--;
        _s4 = (unsigned char)  ((intnumber >> i*4 ) & 0x000f);
        if(_s4<10)
            _s4=_s4+48;
        else
            _s4=_s4+55;

        *txt++= _s4;    
    } while(i);     
}
...
char text [5]={0,0,0,0,0};
...

intToHex(65534,text);
USART_Write_Text(text);
....
1 голос
/ 03 ноября 2010

Вместо sprintf я бы рекомендовал использовать snprintf.

#include <stdio.h>

int main()
{
    char output[5];
    snprintf(output,5,"%04x",255);

    printf("%s\n",output);
    return 0;
}

Это намного безопаснее и доступно почти во всех компиляторах.

0 голосов
/ 28 января 2018

Для динамической фиксированной длины гексагона

string makeFixedLengthHex(const int i, const int length)
{
    std::ostringstream ostr;
    std::stringstream stream;
    stream << std::hex << i;
    ostr << std::setfill('0') << std::setw(length) << stream.str();
    return ostr.str();
}

Но отрицательно, вы должны справиться с этим самостоятельно.

0 голосов
/ 08 ноября 2017

Используя ответ Вики выше

typedef unsigned    long    ulong;
typedef unsigned    char    uchar;

#define TO_HEX(i)   (i <= 9 ? '0' + i : 'A' - 10 + i)
#define max_strhex  (sizeof(ulong)*2)

public uchar
*mStrhex(uchar *p, ulong w, ulong n)
{
    ulong i = 0xF;                                  // index
    ulong mask  = i << (((sizeof(ulong)*2)-1)*4);   // max mask (32 bit ulong mask = 0xF0000000, 16 bit ulong mask = 0xF000)
    ulong shift = (w*4);                            // set up shift to isolate the highest nibble
    if(!w || w > max_strhex)                        // no bold params
        return p;                                   // do nothing for the rebel
    mask  = mask >> (max_strhex-w)*4;               // setup mask to extract hex nibbles
    for(i = 0; i < w; i++){                         // loop and add w nibbles
        shift = shift - 4;                          // hint: start mask for four bit hex is 0xF000, shift is 32, mask >> 32 is 0x0000, mask >> 28 is 0x000F.
        *p++ = TO_HEX(((n & mask) >> shift));       // isolate digit and make hex
        mask = mask >> 4;                           //
        *p = '\0';                                  // be nice to silly people
    }                                               //
    return p;                                       // point to null, allow concatenation
}
0 голосов
/ 22 апреля 2017

Вы можете использовать это просто и легко конвертировать

typedef union {
    struct hex{
            unsigned  char a;
            unsigned  char b;

    }hex_da;
    short int dec_val;
}hex2dec;

hex2dec value;
value.dec_val=10;

Теперь шестнадцатеричное значение сохраняется в структуре hex_da, чтобы получить доступ к нему для дальнейшего использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...