将字符串转换为十六进制数组

时间:2016-04-17 09:14:12

标签: c++

我正在使用十六进制数据编辑文件。 例如,在我的代码中我有这个:

const char data1[4] = {0xAA, 0xBB, 0xCC, 0xDD};
file.write(data1, 4);

这很有效。我用十六进制编辑器打开文件,可以看到AABBCCDD。

当我通过用户输入获取十六进制数据时,我不知道如何格式化它。它以字符串形式出现,可能是AABBCCDD。但是,如果我将其写入我的文件,我将获得代表我的数据中的A,A,B,B的ASCII十六进制值。

我想将带有十六进制值的字符串转换为char数组,如上面的data1

我搜索并发现了一些我认为可以帮助我的代码。 我改变了它并提出了这个但它似乎不起作用,并想知道是否有更好的方法。

char* hxStringToHxArray (std::string hxinput)
{
    std::stringstream ss;
    char* outputchar = new char[(hxinput.length())/2];
    unsigned int buffer;
    int offset = 0;
    int pos = 0;
    while (offset < hxinput.length()) {
       ss.clear();
       ss << std::hex << hxinput.substr(offset, 2);
       ss >> buffer;
       outputchar[0] = (static_cast<unsigned char>(buffer));
       offset += 2;
       pos++;
    }
    return outputchar;
}

可能代码存在一些问题,但如果有更好的方法可以做到这一点,我很高兴听到。 我不会处理动态长度的十六进制字符串,我将始终知道长度,这有助于。 感谢。

EDIT。 啊,我刚刚意识到我的示例数据中存在错误。我更新了,抱歉。

2 个答案:

答案 0 :(得分:1)

您可以编写自己的解析器,也可以使用std::strtol。任何一个都应该工作。这是一个家庭酿造实现,假设字符A - Fa - f是连续编码的:

#include <cstdlib>
#include <string>
#include <vector>

unsigned char parse_hex(char c)
{
    if ('0' <= c && c <= '9') return c - '0';
    if ('A' <= c && c <= 'F') return c - 'A' + 10;
    if ('a' <= c && c <= 'f') return c - 'a' + 10;
    std::abort();
}

std::vector<unsigned char> parse_string(const std::string & s)
{
    if (s.size() % 2 != 0) std::abort();
    std::vector<unsigned char> result(s.size() / 2);

    for (std::size_t i = 0; i != s.size() / 2; ++i)
        result[i] = 16 * parse_hex(s[2 * i]) + parse_hex(s[2 * i + 1]);

    return result;
}

答案 1 :(得分:1)

我认为你这样做很复杂:

int main()
{
    int input[10];
    for (int i =0; i < 10; i++) {
        std::cin >> std::hex >> input[i];
    }
}

这当然没有错误处理,但应该做你想做的事情:

  1. 以格式0xAB
  2. 获取字符串输入
  3. 将其解释为十六进制,即。将其存储为大小为char的数字(我认为通常等于unsigned short
  4. 编辑:当使用char-array时,C ++尝试使用smart-ass并改为给出ASCII值。您可以获取int值并尝试根据您想要做的事情来构建它们。

    完整的代码是:

    #include <iostream>
    #include <fstream>
    
    int main()
    {
        int input[10];
        char c[10];
        for (int i = 0; i < 10; i++) {
            std::cin >> std::hex >> input[i];
            std::cout << "Hex input: " << std::hex << input[i] << "\n"
                << "Hex input as Dec: " << std::dec << input[i] << "\n";
    
            c[i] = static_cast<char>(input[i]);
        }
    
        std::ofstream myfile;
        myfile.open("/tmp/file.txt");
        myfile.write(c, 10);
        myfile.close();
    }
    

    输入:

    1
    2
    3
    4
    5
    A
    B
    C
    D
    E
    

    在文件中:

    $ hexdump -e '/1 "%#X "' /tmp/file.txt
    0X1 0X2 0X3 0X4 0X5 0XA 0XB 0XC 0XD 0XE %