如何在char数组中添加hex?

时间:2017-03-23 19:02:47

标签: c++ arrays

我已经编程了一段时间但我对C ++还不熟悉。我正在编写一个程序,它接受.exe并获取其十六进制并将其存储在unsigned char数组中。我可以接受.exe并返回其十六进制罚款。我的问题是我在char数组中以正确的格式存储十六进制时遇到了麻烦。

当我打印数组时,它输出十六进制,但我需要在前面添加0x。

示例输出:04 5F 4B F4 C5 A5
需要的输出:0x04 0x5F 0x4B 0xF4 0xC5 0xA5

我正在尝试使用hexcode[i] = ("0x%.2X", (unsigned char)c);正确存储它,它似乎仍然只返回最后两个没有0x的字符。

我还尝试了hexcode[i] = '0x' + (unsigned char)c;并查看了sprintf等函数。

任何人都可以帮助我获得所需的输出吗?它甚至可能吗?

完整计划 -

    #include <iostream>

unsigned char hexcode[99999] = { 0 };

//Takes exes hex and place it into unsigned char array
int hexcoder(std::string file) {
    FILE *sf; //executable file
    int i, c;

    sf = fopen(file.c_str(), "rb");
    if (sf == NULL) {
        fprintf(stderr, "Could not open file.", file.c_str());
        return 1;
    }

    for (i = 0;;i++) {
        if ((c = fgetc(sf)) == EOF) break;
        hexcode[i] = ("0x%.2X", (unsigned char)c);

        //Print for debug
        std::cout << std::hex << static_cast<int>(hexcode[i]) << ' ';
    }

}

int main()
{
    std::string file = "shuffle.exe"; // test exe to pass to get hex
    hexcoder(file);
    system("pause");
    return 0;
}

1 个答案:

答案 0 :(得分:1)

我想你想以十六进制格式转储文件。所以也许它类似于您正在寻找的以下代码。 请注意,hexcode更改为数据类型char而不是unsigned char,以便可以将其作为包含可打印字符的字符串进行处理。

int hexcoder(std::string file) {
    FILE *sf; //executable file
    int i, c;

    sf = fopen(file.c_str(), "rb");
    if (sf == NULL) {
        fprintf(stderr, "Could not open file %s.", file.c_str());
        return 1;
    }

    char hexcode[10000];
    char* wptr = hexcode;
    for (i = 0;;i++) {
        if ((c = fgetc(sf)) == EOF) break;

        wptr += sprintf(wptr,"0x%02X ", c);            
    }
    *wptr = 0;

    std::cout << hexcode;

    return 0;
}

顺便说一句:要以十六进制格式打印出一个值,也可以使用......

printf("0x%2X ", c)

std::cout << "0x" << std::hex << std::setw(2) << std::setfill('0') << std::uppercase << c << " ";

请注意,后者需要#include <iomanip>

但是 - 为了不过多地改变代码的语义 - 我将hexcode - 字符串保留为目标。