Преобразование десятичного значения в шестнадцатеричное с тем же видимым представлением

Я работаю над микроконтроллером, который выводит число только в шестнадцатеричном представлении. У меня есть данные, которые рассчитываются в десятичном формате и предназначены для чтения и интерпретации человеком. Мой вывод - это три десятичных числа 45, 27 и 91, когда я вывожу их, я получаю 0x2D, ​​0x1B и 0x5B. Какую операцию я могу выполнить, чтобы преобразовать 45 в 0x45, 27 в 0x27 и так далее.


person cdn    schedule 20.06.2018    source источник
comment
Просто прикрепите строку "0x" спереди... подождите, вы имеете в виду вывод на дисплей? Какой тип данных вы ожидаете для результата?   -  person musefan    schedule 20.06.2018
comment
Как вы выводите свои переменные? Через последовательный интерфейс, журналы отладки, дисплей или что-то другое?   -  person izlin    schedule 20.06.2018
comment
@musefan Эти значения вычисляются во время выполнения. Итак, 45 — это десятичное значение, которое я хочу, чтобы люди видели на выходе. Все они выводятся как беззнаковые символы.   -  person cdn    schedule 20.06.2018
comment
@izlin вывод идет через последовательный интерфейс через USB   -  person cdn    schedule 20.06.2018
comment
Мой вывод - это три десятичных числа 45, 27, 91, поэтому, когда вы получаете 4A, как это работает? 0x45 и 45 не одно и то же   -  person UKMonkey    schedule 20.06.2018
comment
@Ron Я не думаю, что могу использовать потоки, поскольку шестнадцатеричные символы упаковываются в ответ, который затем отправляется через USB, они не выводятся напрямую из моего кода. Я имею в виду, что если у меня есть десятичное число 45, которое я хочу вывести через USB-кабель. Чтобы показать это, я должен вывести число 69, которое равно 0x45.   -  person cdn    schedule 20.06.2018
comment
пожалуйста, покажите свой код. преобразование 27 в 0x27 имеет смысл только в строковом представлении, потому что десятичное 27 не совпадает с шестнадцатеричным 27, поэтому, возможно, вам просто нужно добавить 0x к вашему выводу. Однако мне интересно, откуда вы взяли 27. Вы сами это вычисляете? Вам не нужно этого делать, просто возьмите исходное значение и используйте выходной манипулятор (std::hex)   -  person 463035818_is_not_a_number    schedule 20.06.2018
comment
@UKMonkey: Старики знают этот формат как BCD, Binary Coded Decimal. Когда вы получаете 0x4A hex, вы конвертируете его в 0x74 BCD.   -  person MSalters    schedule 21.06.2018
comment
@MSaltersСпасибо - каждый день узнавайте что-то новое, И приятно снова чувствовать себя молодым! :)   -  person UKMonkey    schedule 21.06.2018


Ответы (2)


Если я вас правильно понял, вы хотите что-то вроде этого:

unsigned char convert(unsigned char in) {
    return ((in % 10) * 0x01) + ((in / 10) * 0x10);
}

int main()
{
    unsigned char a = 45;
    printf ("0x%02X", convert(a)); // prints "0x45"
    return 0;
}

Он преобразует десятичное значение 45 в 0x45, что эквивалентно десятичному 69. Обратите внимание, что функция преобразования на микроконтроллерах работает не очень быстро из-за деления /.

Он может печатать только десятичные значения от 0 до 99, потому что можно использовать только две цифры.

person izlin    schedule 20.06.2018
comment
я немного запутался... почему все это вуду вместо std::cout << "0x" << 45; ? - person 463035818_is_not_a_number; 20.06.2018
comment
@ user463035818 Если я правильно понял вопрос, ему нужно отправить значение через последовательный интерфейс. Вот почему OP попросил преобразовать 45 в 69, чтобы вы могли видеть 0x45 в последовательном потоке. - person izlin; 20.06.2018
comment
до сих пор не понял полностью, но звучит разумно - person 463035818_is_not_a_number; 20.06.2018
comment
Привет, спасибо, это именно то, что я искал! Извините, если я не правильно выразился - person cdn; 20.06.2018

Хотя я думаю, что конвертировать 45 в 0x45 не очень хорошая идея, вот метод:

int dec = 45;
int hex = 0;
int i = 1;
while(dec/10 != 0){
    int digit = dec%10;
    hex += digit*i;
    i *=16;
}
cout << hex << endl;// if you convert "hex" to hexadecimal, it would be 0x45
person mostawk    schedule 20.06.2018