试图写一个C++;函数对8位字符进行非十六进制编码并将其转换为整数 我有一个C++函数,它将一个未签名的long转换成8位的十六进制字符字符串。 我需要想出一个反向函数,它接受一个8位十六进制字符字符串,并将其转换为表示字节的无符号整数
原始UINT->char[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";
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;
}