如何从每个元素中获取字节十六进制值,并将每个十六进制字符保存到字符数组、TCHAR、LPCTSTR 和 CString 中?
是的,我知道其中一些接近或功能相同,但我必须以几种不同的方式保存和操作数据,并且需要这些数据类型。如果这使得这个问题有点太宽泛,为了将这个问题限制在我的直接目的上,我的需求之一是将我收集的数据包数据存储到一个字符数组中,并将其作为十六进制输出到我的 MFC 应用程序上的列表中(
SetItemText(int, int, LPCTSTR)
)。但我想大部分过程都是相似或相同的,我将不胜感激其他数据类型的帮助。
我四处搜索并尝试了几种方法,涉及
stringstream
HERE 、 sprintf
HERE 以及其他一些方法。我能够输出的最多的是数据数组的内存位置(而不是数据本身)。其余的结果是垃圾字符、什么都没有或错误的数据……即使如此,> 10 个零也不存在。我确信错误出在我的实现上,所以我来这里是为了一个重点用例。下面是我正在寻找的框架。
void SaveCharArrayHexData(struct &output, int index)
{
char data[4] = {'0x07', '0x13', '0xF4', '\0'};
//Get byte hex values from data
//Assign each Hex character to datatypes as individual characters, including >10 zeros.
//Example:
// INPUT: data={'0x07', '0x13', '0xF4', '\0'} size = 3
// OUTPUT: outputCharArray={'0', '7', '1', '3', 'F', '4', '\0'} size = 6
//output.outputCharArray = ?
//output.outputLPCTSTR = ?
//output.outputTCHAR = ?
//output.outputCString = ?
m_list.SetItemText(index, 0, outputLPCTSTR);
}
不完全确定我是否正确回答了你的问题;看起来……太微不足道了。
对于此类琐碎的任务,我通常会避免使用 sprintf 和 Streams 之类的东西。
要将单个字符转换为两个十六进制字符,只需执行以下操作:
char hexDigit(unsigned char value)
{
if (value<=9) return '0'+value;
assert(value<=15);
return 'a'-10+value;
}
void toHex(char input, std::string& output)
{
output+=hexDigit(static_cast<unsigned char>(input)>>4);
output+=hexDigit(input&0x0f);
}
toHex()
只是将两个数字附加到输出字符串中。你可以做这样的事情:
#include <string>
#include <iostream>
#include <cassert>
// code from above goes here
int main(void)
{
char data[] = {0x07, 0x13, 0xF4};
std::string result;
for (char c: data)
{
if (!result.empty()) result+=", ";
toHex(c, result);
}
std::cout << result << std::endl;
return 0;
}
试运行:
stieber@gatekeeper:~ $ g++ Test.cpp && ./a.out
07, 13, f4
使其适应您实际想要使用的任何数据类型。