C ++ char шестнадцатеричное значение в байтах - PullRequest
0 голосов
/ 17 августа 2011

У меня есть шестнадцатеричное значение в указателе символа (например, 'F3'), и я хотел бы преобразовать его в байт, потому что я хочу поместить его в массив. Я знаю, что есть много решений, но они не то, что я хотел.

Заранее спасибо!

EDIT:

Хорошо, возможно, я не все написал. Что у меня сейчас:

char aChar[5];
itoa (j, aChar, 16);

j теперь 3, и я просто хочу его в байтах. Атой, scanf не помогает, это разные решения.

Ответы [ 4 ]

6 голосов
/ 17 августа 2011

Поскольку вы пометили этот C ++, а не C, я не собираюсь использовать какие-либо функции C (кроме assert(), чтобы продемонстрировать поведение, граничные условия, и так далее ).Вот пример файла.Давайте назовем его hex2byte.cpp:

#include <sstream>
#include <cassert>

unsigned char hex2byte(const char* hex)
{
    unsigned short byte = 0;
    std::istringstream iss(hex);
    iss >> std::hex >> byte;
    return byte % 0x100;
}

int main()
{
    const char* hex = "F3";
    assert(hex2byte(hex) == 243);
    assert(hex2byte("") == 0);
    assert(hex2byte("00") == 0);
    assert(hex2byte("A") == 10);
    assert(hex2byte("0A") == 10);
    assert(hex2byte("FF") == 255);
    assert(hex2byte("EEFF") == 255);
    assert(hex2byte("GG") == 00);
    assert(hex2byte("a") == 10);
    assert(hex2byte("0a") == 10);
    assert(hex2byte("f3") == 243);
    assert(hex2byte("ff") == 255);
    assert(hex2byte("eeff") == 255);
    assert(hex2byte("gg") == 00);
}

Сделать так:

% make hex2byte
g++ -Wall -Wextra -Wshadow -pedantic -Weffc++ -Werror hex2byte.cpp -o hex2byte

Запустить его:

% ./hex2byte

Нет утверждений.Добавить обработку ошибок по вкусу (например, проверять, когда hex == NULL, и так далее ).

3 голосов
/ 17 августа 2011

Байт - это обычно просто беззнаковый символ

myArray[n] = (unsigned char)*p;

Или вы имеете в виду, что у вас есть строковое представление шестнадцатеричного значения?

1 голос
/ 17 августа 2011

Я могу придумать как минимум пять способов:

  1. с использованием sscanf с %x
  2. с использованием strtol с правильной базой
  3. с использованиемistringstream (хотя вам придется понижать приведение с беззнакового короткого до беззнакового символа)
  4. boost :: spirit
  5. свернутый вручную цикл для разбора посимвольного символа

Ни один из перечисленных вами способов не сработает.Но ваш вопрос все еще не совсем понятен, у вас есть символ, который вы каким-то образом преобразовали в гекс, используя itoa, и теперь вы хотите преобразовать в байт!?!что не так с актерами?например, unsigned char byte = static_cast<unsigned char>(charvalue);

1 голос
/ 17 августа 2011

Дано char * с "F3":

char *hexstr = "F3";

Тогда вы можете сделать это:

unsigned char byteval =
    (((hexstr[0] >= 'A' && hexstr[0] <= 'Z') ? (10 + hexstr[0] - 'A') : 
    (hexstr[0] >= 'a' && hexstr[0] <= 'z') ? (10 + hexstr[0] - 'a') : 
    (hexstr[0] >= '0' && hexstr[0] <= '9') ? (hexstr[0] - '0') : 0) << 4) |
    ((hexstr[1] >= 'A' && hexstr[1] <= 'Z') ? (10 + hexstr[1] - 'A') : 
    (hexstr[1] >= 'a' && hexstr[1] <= 'z') ? (10 + hexstr[1] - 'a') : 
    (hexstr[1] >= '0' && hexstr[1] <= '9') ? (hexstr[1] - '0') : 0);

Простите за уродство; Я уверен, что это может быть улучшено.

Вы можете превратить это в функцию:

inline unsigned char hextobyte(const char *s) {
    return
    (((s[0] >= 'A' && s[0] <= 'Z') ? (10 + s[0] - 'A') : 
    (s[0] >= 'a' && s[0] <= 'z') ? (10 + s[0] - 'a') : 
    (s[0] >= '0' && s[0] <= '9') ? (s[0] - '0') : 0) << 4) |
    ((s[1] >= 'A' && s[1] <= 'Z') ? (10 + s[1] - 'A') : 
    (s[1] >= 'a' && s[1] <= 'z') ? (10 + s[1] - 'a') : 
    (s[1] >= '0' && s[1] <= '9') ? (s[1] - '0') : 0);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...