如何从二进制标准的指针创建具有十六进制信息(作为char)的文件

How to create a file with hexadecimal information (as char) from a pointer in binary standard?

本文关键字:十六进制 信息 作为 文件 char 二进制 标准 创建 指针      更新时间:2023-10-16

我正在尝试创建一个文件,从指针中获取二进制条目,但我在转换时遇到了一些问题。

我的功能是:

pSec指向包含我要写入的信息的第一个地址。

int StoreFile::setK(unsigned int Slot, void* pSec, unsigned int Len) {
    int Ret = 0;
    char tLen[sizeof(Len)];
    char cSec[Len*2], *Sec;
    static char FName[fs_PathMaxLg];
    snprintf(FName, sizeof(FName)-1, "%s/Store.INI", _Dir);
    static char Section[2][20];
    snprintf(Section[0], sizeof(Section[0])-1, "%lu_SIZE", Slot);
    snprintf(Section[1], sizeof(Section[1])-1, "%lu_DATA", Slot);
    do {

在这里,我尝试检查所有地址,将信息传递给char*,但我希望该信息以十六进制形式出现(具有十六进制内容的char数组),但我没有成功地从指向char的地址传递信息。

        BYTE *ptr = (BYTE*)pSec;
        for (int i = 0; i != Len; i++) {
            Sec = strdup((const char*)ptr[i]);
            // snprintf(Sec, 2, "%2.2x", ptr[i]);
            // cSec = (char*)pSec;
            // pSec += 1;
            Sec += 2;
        }
        snprintf(tLen, sizeof(Len), "%x", Len);

这是另一个将字符数组写入文件的函数,只有在写入Sec时才会出现问题。

        Ret = WriteProfile(FName, "STOCK", Section[0], tLen);
        if (Ret != 1) {
            break;
        }
        Ret = WriteProfile(FName, "STOCK", Section[1], Sec);
        if (Ret != 1) {
            break;
        }
        Ret = 0;
    } while(0);

你有什么建议来改进这个代码吗?我已经尝试了很多东西

所以中心部分是将二进制数据转换为十六进制表示。

由于一个字节转换为两个十六进制数字,因此一个十六进制数字等于4个二进制位。所以你必须分别转换一个字节的高4位和低4位。

假设您想将n字节从data转换为字符串s,您可以这样做:

// convert lower 4 bit to hex
char byte2hex(char byte) {
    byte &= 0x0f;
    if (byte >= 10) {
        // a-f
        return byte + 'a' - 10;
    } else {
        // 0-9
        return byte + '0';
    }
}
string bin2hex(const char *data, int n) {
    string s;
    for (int i = 0; i < n; ++i) {
        s.push_back(byte2hex(data[i]>>4));
        s.push_back(byte2hex(data[i]));
    }
    return s;
}