Как загрузить строки в элементы массива BYTE* (C++)

У меня есть программа, которая берет содержимое файла и преобразует его в шестнадцатеричный формат. Я хотел бы взять эти шестнадцатеричные значения и сохранить их как элементы массива unsigned char, который я назвал hexData. Как бы я это сделал?

Я пытался преобразовать шестнадцатеричные данные в 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. Извините, мой первоначальный вопрос был сформулирован так плохо, но я не верю, что указанный на дубликат вопрос отвечает на мой вопрос.


person Shayon Shakoorzadeh    schedule 24.07.2018    source источник
comment
Почему вы хотите преобразовать значения в шестнадцатеричный формат?   -  person    schedule 24.07.2018
comment
Все целые числа являются шестнадцатеричными, или двоичными, или основанными на 10, или основанными на том, что вы хотите использовать. Просто нужно посмотреть на них по-другому. Посмотрите на std::hex манипулятор, чтобы узнать, как легко напечатать число в шестнадцатеричном формате.   -  person user4581301    schedule 24.07.2018
comment
Есть ли причина, по которой вы не используете std::stringstream?   -  person dgnuff    schedule 24.07.2018
comment
Никакого дублирования с заостренным ответом. Вопрос OP является общим и не ограничивается решением ostream.   -  person Amit G.    schedule 25.07.2018
comment
@NeilButterworth У меня есть еще одна функция, которая будет принимать эти беззнаковые символы и возвращать значение crc-16. Однако я не включил эту функцию в этот код.   -  person Shayon Shakoorzadeh    schedule 25.07.2018
comment
Нет причин преобразовывать их в шестнадцатеричный формат для этого - вы, кажется, не понимаете, как значения представлены в двоичном формате внутри компьютера.   -  person    schedule 25.07.2018
comment
Вы правы, память для меня очень новая вещь. Но файлы, с которыми я работаю, закодированы (обычно в формате .hex), и мне все равно нужно преобразовать их в шестнадцатеричный вывод в качестве еще одной функции для моей программы, что уже делает данная программа. Не могли бы вы объяснить лучший способ сделать это?   -  person Shayon Shakoorzadeh    schedule 25.07.2018


Ответы (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;
}
person Amit G.    schedule 24.07.2018