Что означает \ x6d \ xe3 \ x85? - PullRequest
0 голосов
/ 28 декабря 2011

Я не знаю, что это, я нашел это в исходном коде openSSL.

Это какая-то последовательность байтов?По сути, мне просто нужно преобразовать мой char * в этот тип стиля в качестве параметра.

Ответы [ 4 ]

1 голос
/ 28 декабря 2011

Это последовательность байтов в шестнадцатеричном формате. \x6d\xe3\x85 - шестнадцатеричный символ 6d, за которым следует гекс e3, за которым следует гекс 85. Синтаксис: \xnn, где nn - ваша шестнадцатеричная последовательность.

0 голосов
/ 28 декабря 2011

Попробуйте следующий фрагмент кода, чтобы понять больше о шестнадцатеричной последовательности байтов.

#include <stdio.h>

int main(void)
{
    char word[]="\x48\x65\x6c\x6c\x6f"; 
    printf("%s\n", word);

    return 0;
}

/*
Output:
$
$ ./a.out
Hello
$
*/
0 голосов
/ 28 декабря 2011

Если то, что вы прочитали, было

char foo[] = "\x6d\xe3\x85";

тогда это то же самое, что и

char foo[] = { 0x6d, 0xE3, 0x85, 0x00 };

Кроме того, я могу вам сказать, что 0x6D - это кодовая точка ASCII для 'm', 0xE3 - это кодовая точка ISO 8859.1 для 'ã', а 0x85 - это кодовая точка Windows-1252 для '…'.

Но, не зная больше о контексте, я не могу рассказать вам, как "преобразовать [ваш] символ * в этот тип стиля в качестве параметра", за исключением того, что вам, возможно, вообще не понадобится выполнять какое-либо преобразование ! Запись \x позволяет записывать строковые константы, содержащие произвольные последовательности байтов, в ваш исходный код . Если в вашей программе уже есть произвольная последовательность байтов в буфере, я не могу представить, что вам нужно преобразовать ее обратно в нотацию \x перед передачей ее в OpenSSL.

0 голосов
/ 28 декабря 2011

Последовательность \x используется для экранирования байтовых значений в шестнадцатеричном формате. Таким образом, последовательность, которую вы цитировали, экранирует байты 6D, E3 и 85, которые переводятся в 109, 227 и 133. Хотя 6D также может быть представлен как символ m в ASCII, вы не можете представить последние два в ASCII, поскольку он охватывает только диапазон 0,127. Поэтому для значений, превышающих 127, вам нужен особый способ их записи, и \x - такой способ.

Другой способ - использовать восьмеричные числа, используя \<number>, например, 109 будет \155.

Если вам нужны явные байтовые значения, лучше использовать эти escape-последовательности, поскольку (AFAIK) стандарт C не гарантирует, что ваша строка будет закодирована с использованием ASCII. Поэтому, когда вы компилируете, например, в системе EBCDIC, ваш m будет представлен в виде байтового значения 148 вместо 109.

...