Как объединить гекс в строку в C - PullRequest
0 голосов
/ 11 мая 2019

Я пытаюсь создать строку, состоящую из нескольких частей.Он начинается как обычная строка, и в какой-то момент вызывается функция, которая заполняет указатель шестнадцатеричным числом.Как показано ниже.

PVOID hexval = NULL;
PCTSTR mystring = TEXT("BLA");

function(&hexval);

mystring += hexval;  // just an idea of what I want, not actual code

Как показано выше, я хочу, чтобы к mystring добавили hexvalue.Предположим, мой hexvalue равен 0x424C41.Я хочу закончить тем, что mystring означает "BLABLA".

Какой лучший способ сделать это?

Ответы [ 2 ]

1 голос
/ 11 мая 2019

(при условии, что я вас правильно понимаю, и что UNICODE не определен препроцессором)

вы должны сделать следующее:

  1. Выделить место для строки, которая будет содержать обаисходный текст и новый «текст».
  2. Скопируйте исходную строку в новое место.
  3. Объедините байты шестнадцатеричного значения, от младшего к старшему, после копии исходной строки.

Здесь есть два хитрых момента:

  1. Вы не объяснили, как заканчиваются "шестнадцатеричные данные".Всегда ли байт с нулевым значением находится в конце?Или - имеет ли он фиксированный размер?
  2. Порядок байтов шестнадцатеричного значения может не соответствовать порядку байтов, который вы хотите в строке.Некоторые машины сначала сохраняют младший байт («little-endian»; в вашем примере это будет 0x41, 0x4C, 0x42, 0x00 - при условии, что это 4-байтовое значение), в то время как другие сохраняют старший байт первым («big endian»),Если вы не знаете, что находитесь на машине с прямым порядком байтов, вам нужно изменить порядок байтов, и вы не можете просто скопировать с hexval напрямую.

ОДНАКО! Я советую вам не делать ничего из этого.Гораздо лучше избегать попадания в ситуацию, в которой вам необходимо выполнить эти грубые преобразования.Держу пари, что вы, возможно, сможете решить любую проблему, с которой сталкиваетесь по-другому.

0 голосов
/ 11 мая 2019
#include <stddef.h>
#include <stdlib.h>

#include <windows.h>
#include <tchar.h>

int main(void)
{
    ULONG_PTR value  = 0x424C41;
    LPVOID hexval    = &value;
    PCTSTR mystring  = _T("BLA");

    size_t length    = _tcslen(mystring);
    size_t new_size  = length + sizeof(ULONG_PTR) + 1;

    LPTSTR new_string = calloc(new_size, sizeof(*new_string));
    _tcscpy(new_string, mystring);

    size_t offset;
    for (offset = sizeof(ULONG_PTR); offset && !((char*)hexval)[offset - 1]; --offset);

    for (size_t i = length ? length : 0, k = offset; k; ++i, --k)
        new_string[i] = ((char*)hexval)[k - 1];

    _tprintf(_T("\"%s\"\n"), new_string);
    free(new_string);
}

Однако поддержка ANSI в 2019 году - мазохизм.

...