如何将指针指向的内存十六进制值存入变量并保留HEX格式
核心解决思路
你要做的是把二进制字节序列转换为十六进制字符表示形式后再存储,而不是直接写入原始二进制字节。比如字节0x61转换为字符串"61",写入txt后就会显示为61而不是ASCII字符a。
1. 先实现二进制转十六进制字符串的通用函数
#include <string> #include <cstdint> std::string bytes_to_hex(const uint8_t* data, size_t len) { static const char hex_digits[] = "0123456789abcdef"; std::string res; res.reserve(len * 2); for (size_t i = 0; i < len; i++) { // 取高4位转hex字符 res += hex_digits[(data[i] >> 4) & 0x0F]; // 取低4位转hex字符 res += hex_digits[data[i] & 0x0F]; // 如果需要每个字节之间加空格,此处追加 res += ' '; 即可 } return res; }
2. 修正原有代码的错误逻辑
你原有代码里int* a = (int*)&ctext; DWORD WW = *(int*)a;是完全错误的操作:ctext是secure_string(本质是std::string的别名),取它的地址强转int拿到的是std::string内部结构体的前4个字节,不是加密后的实际二进制数据。
修改后的完整函数逻辑:
std::string getmac_encrypted() { // Load the necessary cipher EVP_add_cipher(EVP_aes_256_cbc()); // plaintext, ciphertext, recovered text std::string x = exec("wmic csproduct get uuid / format:list"); std::string after = md5(x.substr(17, 30)); secure_string ctext, rtext; secure_string ptext = after.c_str(); byte key[KEY_SIZE], iv[BLOCK_SIZE]; WriteString("12345678901234567890123456789012", 0, (char*)key); WriteString("1234567890123456", 0, (char*)iv); aes_encrypt(key, 0, ptext, ctext); // 加密后的二进制数据直接转十六进制字符串 std::string hex_str = bytes_to_hex((const uint8_t*)ctext.data(), ctext.size()); // 此处直接把hex_str写入txt文件即可,就是你要的HEX格式 // 示例写入代码: // FILE* fp = fopen("output.txt", "w"); // fputs(hex_str.c_str(), fp); // fclose(fp); return hex_str; }
额外说明
- 如果需要大写十六进制,把
hex_digits里的小写字母改成大写ABCDEF即可 - 如果需要字节之间加分隔符(比如冒号、横杠),在转换每个字节的两个字符后追加对应字符即可
内容的提问来源于stack exchange,提问作者Rooted0x01
相关产品推荐
相关产品推荐

