将字符指针中的十六进制转换为十进制
Convert Hex in Char Pointer to Decimal
我有一个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.
同样,我没有逐个获取每个数字以转换为十进制。
那么我能做些什么来将这种包含十六进制的字符指针转换为十进制呢?
从代码块中的描述来看,似乎不需要字符串或复杂的转换。他们似乎只想将大端字节数组转换为本机字节序数。
代码中嵌入的注释似乎需要更多解释或警告。
//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
转换为有符号类型。通常最好在通话后执行此操作,并且您已经测试并确认您阅读的内容是有效且可用的。
我假设参数字符* 十六进制包含您可以直接读取的物理地址。
然后使用
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个字节,它真的没有太大区别。
相关文章:
- visual在c++中将十进制数转换为二进制数
- C++十进制到二进制,如何转换
- C++从二进制转换为十进制数
- 我编写了代码将十进制分数转换为其二进制等效数.它编译得很好,但在执行时挂起
- 将分数转换为十进制数并对其进行排序
- 将字符串(可以是十进制字符串或十六进制字符串)转换为整数C++
- 十进制到二进制转换器 c++
- 如何在C ++中将二进制字符串128位转换为十进制字符串?
- 将二进制转换为十进制,我如何要求用户仅输入二进制
- 我正在尝试编写将 ASCII 转换为十进制、添加并转换回 ASCII 的软件
- 如何将QBytearrayBCD转换为十进制QString表示
- C++:二进制到十进制w/转换过程的外观
- 十六进制到十进制转换的未清理答案
- 如何在C++中将二进制编码十进制转换为 int
- 如何将带有浮点数的字符串转换为十进制?
- 如何使用链表将负十进制数转换为二进制?
- 将字符指针中的十六进制转换为十进制
- 使用 std::hex 将十六进制转换为十进制
- 十进制,包括负到 32 位二进制转换器
- 使用动态比特斯转换十进制数字