试图写一个C++;函数对8位字符进行非十六进制编码并将其转换为整数 我有一个C++函数,它将一个未签名的long转换成8位的十六进制字符字符串。 我需要想出一个反向函数,它接受一个8位十六进制字符字符串,并将其转换为表示字节的无符号整数

试图写一个C++;函数对8位字符进行非十六进制编码并将其转换为整数 我有一个C++函数,它将一个未签名的long转换成8位的十六进制字符字符串。 我需要想出一个反向函数,它接受一个8位十六进制字符字符串,并将其转换为表示字节的无符号整数,c++,bit-shift,C++,Bit Shift,原始UINT->char[8]方法: std::string ResultsToHex( unsigned int EncodeResults) { std::cout << "UINT Input ==>"; std::cout << EncodeResults; std:cout<<"\n"; char _HexCodes[] = "0123456789ABCDEF";

原始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);
    }
std::string ResultsToHex(unsigned int-EncodeResults)
{

std::cout为什么要手动执行?有很多工具可以为您执行此操作。例如,stringstream

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

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

stream您需要扫描字符串并将每个十六进制字符转换回对应的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;
}
#包括
无符号int-ConvertHexString(char*str)
{
无符号整数结果=0;
while(*str)
{
char ch=*str++;
//检查0、1、2、3、4、5、6、7、8和9

如果(ch>='0'&&ch='a'&&ch='a'&&ch),我方将非常感谢你方的一些努力。这里的想法是,你给我们一个你无法解决的谜题的一小部分,而不是桌子上的所有500块杂乱无章,说“我看不出这些块在一起。”。这实际上只是做了与“将数字转换为十六进制字符串”相反的事情。答案的可能重复可能会在问题中等待您,您在示例函数中看到的反向位移位操作是什么。“8位十六进制字符字符串”没有意义——十六进制字符每个编码4位。也许你的意思是“8个十六进制字符字符串”(总共32位)?或者可能是一个2个字符的十六进制字符串,总共8位?大概家庭作业课是关于“十六进制数和位移位”,而不是“如何使用已经编写的代码在最少的行中完成此操作”@Matstpeterson:
我需要一个反向函数,它接受一个8位十六进制字符字符串,并将其转换为一个表示字节的无符号整数
。关于比特移位一词也没有。对我来说,这看起来像是试图通过专注于“什么是整数”、“什么是字节”、“什么是十六进制”来解决问题而不是用普通的标准方法来做。但是,我同意,这也可能是一个家庭作业。我们很快就会听到它:确实不是。但是大多数家庭作业的学生都不在“我的C++书的第3章”,这是关于整数、位和字节的。事实上,其余的代码不使用C++字符串、向量等,但这表明,如果我在一个不愉快的情绪中,我的答案至少会是一个模糊的,我想他应该使用位移操作来解决这个问题,以获得好的解决方案。抱歉,没有立即发现它;o).@g-makulik那里有一点变化……它会让行动开始的。
#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;
}