0

我有一个 C++ 函数,可以将 unsigned long 转换为 8 位十六进制字符字符串。我需要想出一个反向函数,它接受一个 8 位十六进制字符字符串并将其转换为一个无符号整数来表示它的字节。

原始 UINT -> char[8] 方法:

std::string ResultsToHex( unsigned int EncodeResults)
{

        std::cout << "UINT Input ==>";
        std::cout << EncodeResults;
        std:cout<<"\n";

        char _HexCodes[] = "0123456789ABCDEF";
        unsigned int HexAccum = EncodeResults;
        char tBuf[9];
        tBuf[8] = '\0';
        int Counter = 8;
        unsigned int Mask = 0x0000000F;
        char intermed;

        // Start with the Least significant digit and work backwards

        while( Counter-- > 0 )
        {

            // Get the hex digit
            unsigned int tmp = HexAccum & Mask;

            intermed = _HexCodes[tmp];

            tBuf[Counter] = intermed;

            // Next digit
            HexAccum = HexAccum >> 4;
        }

        std::cout << "Hex char Output ==>";
        std::cout << tBuf;
        std::cout << "\n";

        return std::string(tBuf);
    }

这是我正在尝试编写的函数,它将以 char[8] 作为输入并转换为 UINT:

 unsigned int ResultsUnhex( char tBuf[9])
{
        unsigned int result = 0;
        std::cout << "hex char Input ==>";
        std::cout << tBuf;
        std:cout<<"\n";

        //CODE TO CONVERT 8 char (bit) hex char into unsigned int goes here......
        //
        // while() {}
        //
        ///


        std::cout << "UINT Output ==>";
        std::cout << result;
        std::cout << "\n";

        return result;
    }

我是位移的新手,任何帮助将不胜感激:)。

4

2 回答 2

2

您需要扫描字符串并将每个十六进制字符转换回它对应的 4 位二进制值。您可以使用一组简单的if语句来执行此操作,这些语句检查字符以查看它是否有效,如果是则将其转换回来。

字符转换后,将结果变量左移 4 位,然后将转换后的值填充到结果的低 4 位。

#include <stdexcept>

unsigned int ConvertHexString(char *str)
{
    unsigned int result = 0;
    while(*str)
    {
        char ch = *str++;

        // Check for 0, 1, 2, 3, 4, 5, 6, 7, 8, and 9
        if(ch >= '0' && ch <= '9')
        {
            ch -= '0';
        }
        // Check for a, b, c, d, e, f
        else if(ch >= 'a' && ch <= 'f')
        {
            ch = 10 + (ch - 'a');
        }
        // Check for A, B, C, D, E, F
        else if(ch >= 'A' && ch <= 'F')
        {
            ch = 10 + (ch - 'A');
        }
        // Opps! Invalid character
        else
        {
            throw std::invalid_argument("Unknown character in hex string");
        }


        // Mmmm! Stuffing! Don't forget to check for overflow!
        result = (result << 4) | ch;
    }

    return result;
}

有几种方法可以做到这一点,但我想一个简单的例子让你开始会更有帮助。

使用转换功能的强制性示例。

#include <iostream>
int main()
{
    std::cout
        << std::hex
        << ConvertHexString("1234567")
        << ConvertHexString("90ABCDEF")
        << std::endl;
}

输出...

123456790abcdef

于 2013-07-02T22:45:37.117 回答
0

你为什么要手动做?有很多工具可以为您做到这一点。例如,字符串流。

这会将 int 转换为十六进制字符串:

std::stringstream stream;
stream << std::hex << your_int;
std::string result( stream.str() );

[在 C++ 中从整数复制到十六进制字符串的代码- 请参阅该线程,有很多示例。在那里而不是在这里投票。]

添加到那个“0x”和一些字段宽度操纵器,你可以减少ResultsToHex到三..五行。

stringstream 也以另一种方式工作。使用>>运算符,您可以轻松地将十六进制字符串读入整数变量。[将十六进制转换为十进制,将十六进制字符转换为 C++ 中的 int将十六进制缓冲区转换为无符号整数,...]

于 2013-07-02T22:07:40.523 回答