我已经编程了一段时间但我对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;
}
答案 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
- 字符串保留为目标。