Объединить 2 шестнадцатеричных символа из файла и преобразовать в десятичный

#c #hex

#c #шестнадцатеричный

Вопрос:

Я пытаюсь объединить два шестнадцатеричных символа из файла в один шестнадцатеричный, а затем преобразовать в десятичные / целые числа. Я считываю всю строку из файла как строку и разбираю ее на отдельные символы (поскольку каждый шестнадцатеричный представляет собой отдельный объект), но один объект — это два шестнадцатеричных символа, и я пытаюсь понять, как их объединить. Итак, в файле в элементах 4 и 5 у меня есть шестнадцатеричные значения 0x1F и 0x01, и я пытаюсь объединить их, чтобы получить 0x011F (зарезервированное направление). Вот пример кода (работающего на C ):

 std::string fileline;
unsigned char tempchar;
tempchar = fileline.at(3); //Sample of parsing individual chars
std::cout << (int)tempchar <<std::endl; //Displaying the correct value
//This is where I am having problems
unsigned char newchar[2];
//From the file, fileline.at(5) = 0x01 and fileline.at(4) = 0x1F
//Trying to get the value of 287 from these two elements
newchar[0] = fileline.at(5); newchar[1] = fileline.at(4);
//This is where it goes wrong and I dont know how to combine the two separate elements
  

Комментарии:

1. Если два числа по отдельности являются l и h и представляют собой 1 или 2-значные шестнадцатеричные числа, то объединенное число равно h * 256 l. Simples! Остальное зависит от форматирования.

2. Что, если бы у меня было более 2 чисел? Я очень новичок в использовании шестнадцатеричной системы счисления, поэтому для меня это все ново

3. Сколько еще чисел?

4. может быть где угодно от 2 до 10, вот почему я пытаюсь написать функцию C для этого

5. К сожалению, более 8 чисел будут переполнять один 64-битный целочисленный тип. Поэтому мой подход, вероятно, будет чрезмерно сложным.

Ответ №1:

Как упоминалось в комментариях, вам требуется преобразование шестнадцатеричных чисел, которые будут переполнять целочисленные типы. В этом случае вам нужно использовать библиотеку (или создать ее), которая выполняет такие задачи.

Библиотека GNU MP — хорошее место для начала. Вы можете создать экземпляр mpz_class с вашей шестнадцатеричной строкой, и вы получите функционально эквивалентный тип с нужным вам значением (см. Этот пример API). Затем вы можете использовать его в арифметике или распечатать в виде десятичной строки.