如何将 char 数组元素中的十六进制值字符保存到 char 数组、TCHAR、LPCTSTR 和 CString?

问题描述 投票:0回答:1

如何从每个元素中获取字节十六进制值,并将每个十六进制字符保存到字符数组、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);

} 
c++ arrays char hex mfc-feature-pack
1个回答
0
投票

不完全确定我是否正确回答了你的问题;看起来……太微不足道了。

对于此类琐碎的任务,我通常会避免使用 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

使其适应您实际想要使用的任何数据类型。

© www.soinside.com 2019 - 2024. All rights reserved.