如何将字符串加载到 BYTE* 数组(C++)的元素中 [重复]

Posted

技术标签:

【中文标题】如何将字符串加载到 BYTE* 数组(C++)的元素中 [重复]【英文标题】:How to load strings into elements of BYTE* array (C++) [duplicate] 【发布时间】:2018-07-24 20:05:00 【问题描述】:

我有一个程序可以获取文件的内容并将其转换为十六进制。我想获取这些十六进制值并将它们存储为我称为 hexData 的unsigned char 数组的元素。我该怎么办?

我尝试将十六进制数据转换为string literal(例如0x5A)并将其转换为char*,但是当我尝试运行代码时没有任何反应(没有输出,没有错误)。这似乎也是一种非常低效的方法。我把代码留在里面看看我的意思。


#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;

typedef unsigned char      BYTE;
typedef unsigned short int WORD;

int main()


    ifstream ifd("C:\\Users\\Shayon Shakoorzadeh\\Documents\\test.txt", ios::binary | ios::ate);
    int size = ifd.tellg();
    ifd.seekg(0, ios::beg);
    vector<char> buffer;
    buffer.resize(size);
    ifd.read(buffer.data(), size);

    static BYTE hexData[100000] =
    

    ;

    string tempStr;
    char *tempChar;

    const int N = 16;
    const char hex[] = "0123456789ABCDEF";
    char buf[N*4+5+2];

    for (int i = 0; i < buffer.size(); ++i)
    
        int n = i % N;

        // little endian format
        if (i > 0 && i < buffer.size()-1)
            swap(buffer[i], buffer[i+1]);

        // checks to see if at the end
        if (n == 0)
        
            memset(buf, 0x20, sizeof(buf));
            buf[sizeof(buf) - 3] = '\n';
            buf[sizeof(buf) - 1] = '\0';
        
        unsigned char c = (unsigned char)buffer[i];

        // storing the hex values
        buf[n*3+0] = hex[c / 16];
        buf[n*3+1] = hex[c % 16];

        //encoded buffer
        buf[3*N+5+n] = (c>=' ' && c<='~') ? c : '.';

        //my attempt
        tempStr = "0x" + string(1, hex[c / 16]) + string(1, hex[c % 16]);
        tempChar = (char*)alloca(tempStr.size() + 1);
        memcpy(tempChar, tempStr.c_str(), tempStr.size() + 1);
        strcpy( (char*) hexData[i] , tempChar);


     
 

静态 BYTE hexData[] 数组需要具有如下所示的值:

0x5A, 0x00, 0x7F, 0x90, 0x8A,...等等

任何帮助将不胜感激!

编辑:

让我说明一下,我无法将这些值存储到名为“hexData”的数组中。我已经从我的文件中获取了十六进制值,但只是作为字符串。我想将这些字符串转换为无符号字符,以便可以将它们放入我的 hexData 数组中。抱歉,我最初的问题措辞如此糟糕,但我不相信指出的重复问题能回答我的问题。

【问题讨论】:

为什么要将值转换为十六进制? 所有整数都是十六进制,或二进制,或以 10 为基数,或以任何你想使用的为基数。你只需要以不同的方式看待它们。 Take a look at the std::hex manipulator 以简单的方式打印十六进制数字。 你有什么理由不使用std::stringstream? 没有重复明确的答案。 OP 问题很笼统,并且不限于 ostream 解决方案。 @NeilButterworth 我有另一个函数将采用那些无符号字符并返回一个 crc-16 值。不过,我没有在这段代码中包含该函数。 【参考方案1】:

这是用十六进制表示字节值的方法

有用的格式说明符如下: %x - 输出为十六进制,例如:2d .. %02x - 用零填充,最少 2 个字符,例如:0e .. “0x%02x”表示:0x00。

void byte_to_hex_string(unsigned char decimal) // Print Hexadecimal

    if (decimal < 256)
    
        char hexstring[8] 0 ;
        sprintf(hexstring, "0x%02x", decimal);
        printf("%s\n", hexstring);
    


int main()

    byte_to_hex_string('A');

    return 0;

【讨论】:

以上是关于如何将字符串加载到 BYTE* 数组(C++)的元素中 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

C++如何把位图保存到数组中

如何将C++中string类型的字符串赋给unsigned char数组

如何在 Visual C++ 中将字节数组转换为十六进制字符串?

如何在 C++ CLR 中将数组<System::Byte> 转换为 char*?

如何将BYTE数组初始化

如何将16进制 转换byte数组