Преобразовать шестнадцатеричный код в Char Pointer в десятичный - PullRequest
0 голосов
/ 28 июня 2018

У меня есть приложение на C ++, у которого есть много API, которые вызываются различными приложениями. Одна из функций в приложении C ++:

long void ConvertHexToDec (char* hex, int size)
{
    // hex - Hex value passed in as char pointer
    // size - size in bytes 

    //Now for e.g., if the values are ...
    // hex = 567D & size = 2

    for (int i = 0; i < size; i++)
    {
       printf ("hex[i] = %x", i, hex[i]);
    }

     // the above FOR loop will print
     // hex[0] = 56
     // hex[1] = 7D

     // I was hoping to get each digit in a separate index like, hex[0] = 5, hex[1] = 6, hex[2] = 7, hex[3] = D

     //the application that calls this C++ API is reading values from a hardware 
     //device and get the values in hex, and then call this API to convert it to 
     //decimal.

     //so in above example it reads memory location 0xB10A and get a 2 byte value
     //of 567D

     //I see many examples of hex to decimal conversion in C++, but all of them
     //uses logic to convert by taking one value at a time.
     //so from above example, it will start at D and then convert that to decimal
     //and then take 7 and convert that and then next and so on......

     //Here there's no way i can do that, as every byte has 2 digits in it.
     //And this is my challenge and i have no idea...
}

Что я пробовал:

 string str;
    str = "";

    for (int i = 0; i < size; i++)
    {
       printf ("hex[i] = %x", i, hex[i]);
       str += hex[i];
    }

    //But when i print out string value it again comes out as....

    for (int i = 0; i < size; i++)
    {
       printf ("str[i] = %x", i, str[i]);
    }

    //str[0] = 56
    //str[1] = 7D

Также пробовал,

   std::hex // this gives a junk "decimal" value and that's no where close to the 
              //real decimal value.

Опять не получаю каждую цифру одну за другой, чтобы преобразовать в десятичную.

Так что же я могу сделать, чтобы преобразовать указатель типа char, содержащий шестнадцатеричный код, в десятичный?

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Из описания в блоке кода, похоже, нет необходимости в строках или сложном преобразовании. Похоже, они хотят преобразовать байтовый массив с прямым порядком байтов в число с прямым порядком байтов.

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

//long void ConvertHexToDec (char* hex, int size) has been changed to
long ConvertHexToDec (const char* hex, int size)
// const char * much more versatile than char * and since we aren't changing hex
// might as well make it const. And what the heck is a long void? A big nothing?
{
    long result = hex[0]; // assuming hex not NULL and size > 0
    for (int i = 1; i < size; i++) // loop until out of bytes. Note: long might only
                                   // hold 4 bytes.
    {
        result <<= 8; // shift current data over one byte
        result += (unsigned char)hex[i]; // add in new byte. Cast required to avoid sign 
                                         // extension during the math if char happens to
                                         // be signed. Note that overflow of the long 
                                         // can bring nasty surprises of its own
    }
    return result;
}

Для подобных вещей я обычно использую целые числа фиксированной ширины в cstdint, а не такие типы, как long и char. Это может предотвратить очень неприятные сюрпризы. Здесь я буду переписывать

uint32_t ConvertHexToDec (const uint8_t* hex, size_t size)
{
    if (size > 0 || size <= sizeof(uint32_t)) // no surprises. Up to 4 bytes regardless 
                                              // of target, and no signed overflow.
    {
        uint32_t result = hex[0];
        for (size_t i = 1; i < size; i++)
        {
            result <<= 8;
            result += hex[i];
        }
        return result;
    }
    throw std::out_of_range("Invalid size"); // can't convert = no result
}

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

0 голосов
/ 28 июня 2018

Я предполагаю, что param char * hex содержит физический адрес, который вы можете прочитать напрямую.

Тогда используйте

long ConvertHexToDec2Bytes(char* hex)
{
    const auto n = *(short*)hex;

#ifdef WANNA_COUT
    std::cout << n << std::endl;
#endif
#ifdef WANNA_STRING
    const auto str = std::to_string(n);
#endif

    return n;
}

Можете ли вы преобразовать 4 байта или 8 байтов, и это действительно не так уж и отличается.

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