Byte to ascii cpp

k-rol / HexToAscii.cpp

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters

# include
# include
using namespace std ;
int hexToInt ( char c)
int first = c / 16 — 3 ;
int second = c % 16 ;
int result = first* 10 + second;
if (result > 9 ) result—;
return result;
>
int hexToLetter ( char c, char d)
int high = hexToInt (c) * 16 ;
int low = hexToInt (d);
return high+low;
>
int main ()
const char * hexChar = » 0008706574756C61 » ;
int length = strlen (hexChar);
char buf = 0 ;
cout
for ( int i = 0 ; i < length; i++)
if (i % 2 != 0 )
printf ( » %c » , hexToLetter (buf,hexChar[i]));
// Different output
// cout (hexToLetter(buf,hexChar[i]));
> else
buf = hexChar[i];
>
>
cout
return 0 ;
>

Источник

Преобразование из байта в ASCII в C

Кто-нибудь может предложить средства преобразования байтового массива в ASCII в C? Или преобразование байтового массива в шестнадцатеричный, а затем в ASCII?

[04/02] [Отредактировано]: Чтобы перефразировать его, я хочу преобразовать байты в шестнадцатеричные и сохранить преобразованные шестнадцатеричные значения в структуре данных. Как это сделать?

3 ответа

Прежде всего, вам следует позаботиться о формулировке ваших вопросов. Трудно сказать то, что вы действительно хотите услышать. Я думаю, что у вас есть какой-то двоичный двоичный объект и вы хотите, чтобы он был в удобочитаемой форме, например, чтобы вывести его на экран для отладки. (Я знаю, что, возможно, я неправильно вас здесь понимаю).

Ты можешь использовать snprintf(buf, sizeof(buf), «%.2x», byte_array[i]) например, чтобы преобразовать один байт в шестнадцатеричное представление ASCII. Вот функция для вывода всей области памяти на экран:

 void hexdump(const void *data, int size) < const unsigned char *byte = data; while (size >0) < size--; printf("%.2x ", *byte); byte++; >> 

Хорошо, если вы интерпретируете целое число как char в C вы получите этот символ ASCII, если он находится в диапазоне.

int i = 97; char c = i; printf("The character of %d is %c\n", i, c); 

Обратите внимание, что проверка ошибок не выполняется — я предполагаю 0

В противном случае массив байтовых значений может быть напрямую интерпретирован как строка ASCII:

char bytes[] = ; printf("The string: %s\n", bytes); 

Обратите внимание на последний байт: 0, он необходим для правильного завершения строки. Ты можешь использовать bytes как любая другая строка C, скопируйте ее, добавьте в другие строки, просмотрите ее, напечатайте и т. д.

Источник

Как конвертировать UTF-8 в ASCII в C ++?

Прежде всего, обратите внимание, что ASCII — это 7-битный формат. Есть 8-битные кодировки, если вы после одного из них (например, ISO 8859-1), вам нужно быть более конкретным.

Чтобы преобразовать строку ASCII в UTF-8, ничего не делайте: они одинаковы. Поэтому, если ваша строка UTF-8 состоит только из символов ASCII, это уже строка ASCII, и преобразование не требуется.

Если строка UTF-8 содержит символы, отличные от ASCII (что-либо с акцентами или нелатинскими символами), невозможно преобразовать его в ASCII. (Возможно, вы сможете конвертировать его в один из ISO-кодировок.)

Есть способы снять акценты с латинских символов, чтобы получить хотя бы некоторое сходство в ASCII. Альтернативно, если вы просто хотите удалить символы, отличные от ASCII, просто удалите все байты со значениями >= 128 из строки utf-8.

Этот пример работает под Windows (вы не указали свою целевую операционную систему):

 // The sample buffer contains "haates" in UTF-8 unsigned char buffer[15] = < 0xc2, 0xa9, 0x68, 0x61, 0xc2, 0xae, 0x61, 0xc2, 0xa9, 0x74, 0x65, 0xc2, 0xae, 0x73, 0x00 >; // utf8 is the pointer to your UTF-8 string char* utf8 = (char*)buffer; // convert multibyte UTF-8 to wide string UTF-16 int length = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)utf8, -1, NULL, 0); if (length > 0) < wchar_t* wide = new wchar_t[length]; MultiByteToWideChar(CP_UTF8, 0, (LPCSTR)utf8, -1, wide, length); // convert it to ANSI, use setlocale() to set your locale, if not set size_t convertedChars = 0; char* ansi = new char[length]; wcstombs_s(&convertedChars, ansi, length, wide, _TRUNCATE); >

Помните delete[] wide; и/или ansi , когда это больше не нужно. Поскольку это unicode, я бы рекомендовал придерживаться wchar_t* вместо char* , если вы не уверены, что входной буфер содержит символы, принадлежащие одному и тому же подмножеству ANSI.

Вероятно, потому что XPEmbedded не поставляется с кодовой страницей US-ASCII (20127), установленной по умолчанию. Мы тоже столкнулись с этим.

Если строка содержит символы, которые не существуют в ASCII, то вы ничего не можете сделать , потому что, ну, эти символы не существуют в ASCII.

Если строка содержит только символы, которые существуют в ASCII, то вам нечего нужно, потому что строка уже находится в кодировке ASCII: UTF-8 был специально разработан для обратного просмотра совместим с ASCII таким образом, что любой символ, который находится в ASCII, имеет ту же самую кодировку в UTF-8, что и в ASCII, и что любой символ, который не находится в ASCII, никогда не может иметь кодировку, которая действительна ASCII, т.е. всегда будет иметь кодировку, которая является незаконной в ASCII (в частности, любой символ не ASCII будет закодирован как последовательность из 2 байтов, 4 октета, все из которых имеют свой самый старший бит, т.е. имеют целочисленное значение > 127).

Вместо того, чтобы просто пытаться преобразовать строку, вы можете попытаться транслитерировать строку. Большинство языков на этой планете имеют некоторую форму схемы транслитерации ASCII, которая, по крайней мере, сохраняет текст несколько понятным. Например, мое имя — «Jörg», а его транслитерация ASCII будет «Joerg». Имя создателя языка программирования Ruby — «ま つ も と ゆ き ひ ろ», а его транслитерация ASCII будет «Matsumoto Yukihiro». Однако учтите, что вы потеряете информацию. Например, немецкая sz-лигатура транслитерируется на «ss», поэтому слово «Maße» (измерения) транслитерируется на «Masse». Однако «Массе» (масса, в физическом смысле, а не христиане) также является словом. В качестве другого примера у турецкого языка есть 4 «i» (малые и капитальные, с точкой и без точек), а ASCII имеет только 2 (малые с точкой и столицей без точки), поэтому вы либо потеряете информацию о точке, либо не хотите была заглавная буква.

Таким образом, единственный способ, который не потеряет информацию (другими словами: поврежденные данные), заключается в том, чтобы каким-то образом закодировать символы, отличные от ASCII, в последовательности символов ASCII. Существует множество популярных схем кодирования: ссылки на объекты SGML, MIME, escape-последовательности Unicode, T и Epsilon; & Chi; или LaT & Epsilon; & Chi;. Таким образом, вы будете кодировать данные по мере их входа в вашу систему и декодировать ее, когда она покидает систему.

Конечно, самым простым способом было бы просто исправить вашу систему.

Источник

C++ (Cpp) BYTE_TO_ASCII примеры использования

C++ (Cpp) BYTE_TO_ASCII — 10 примеров найдено. Это лучшие примеры C++ (Cpp) кода для BYTE_TO_ASCII, полученные из open source проектов. Вы можете ставить оценку каждому примеру, чтобы помочь нам улучшить качество примеров.

static int PTRCALL PREFIX(predefinedEntityName)(const ENCODING *enc, const char *ptr, const char *end) < UNUSED(enc); switch ((end - ptr)/MINBPC(enc)) < case 2: if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) < switch (BYTE_TO_ASCII(enc, ptr)) < case ASCII_l: return ASCII_LT; case ASCII_g: return ASCII_GT; >> break; case 3: if (CHAR_MATCHES(enc, ptr, ASCII_a)) < ptr += MINBPC(enc); if (CHAR_MATCHES(enc, ptr, ASCII_m)) < ptr += MINBPC(enc); if (CHAR_MATCHES(enc, ptr, ASCII_p)) return ASCII_AMP; >> break; case 4: switch (BYTE_TO_ASCII(enc, ptr)) < case ASCII_q: ptr += MINBPC(enc); if (CHAR_MATCHES(enc, ptr, ASCII_u)) < ptr += MINBPC(enc); if (CHAR_MATCHES(enc, ptr, ASCII_o)) < ptr += MINBPC(enc); if (CHAR_MATCHES(enc, ptr, ASCII_t)) return ASCII_QUOT; >> break; case ASCII_a: ptr += MINBPC(enc); if (CHAR_MATCHES(enc, ptr, ASCII_p)) < ptr += MINBPC(enc); if (CHAR_MATCHES(enc, ptr, ASCII_o)) < ptr += MINBPC(enc); if (CHAR_MATCHES(enc, ptr, ASCII_s)) return ASCII_APOS; >> break; > > return 0; >
static int PTRCALL PREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end, const char **badPtr) < ptr += MINBPC(enc); end -= MINBPC(enc); for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) < switch (BYTE_TYPE(enc, ptr)) < case BT_DIGIT: case BT_HEX: case BT_MINUS: case BT_APOS: case BT_LPAR: case BT_RPAR: case BT_PLUS: case BT_COMMA: case BT_SOL: case BT_EQUALS: case BT_QUEST: case BT_CR: case BT_LF: case BT_SEMI: case BT_EXCL: case BT_AST: case BT_PERCNT: case BT_NUM: #ifdef XML_NS case BT_COLON: #endif break; case BT_S: if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) < *badPtr = ptr; return 0; >break; case BT_NAME: case BT_NMSTRT: if (!(BYTE_TO_ASCII(enc, ptr) & ~0x7f)) break; /* fall through */ default: switch (BYTE_TO_ASCII(enc, ptr)) < case 0x24: /* $ */ case 0x40: /* @ */ break; default: *badPtr = ptr; return 0; >break; > > return 1; >
static int PREFIX(predefinedEntityName)(const ENCODING *enc, const char *ptr, const char *end) < (void)enc; switch (end - ptr) < case 2 * MINBPC: if (CHAR_MATCHES(enc, ptr + MINBPC, 't')) < switch (BYTE_TO_ASCII(enc, ptr)) < case 'l': return ''; > > break; case 3 * MINBPC: if (CHAR_MATCHES(enc, ptr, 'a')) < ptr += MINBPC; if (CHAR_MATCHES(enc, ptr, 'm')) < ptr += MINBPC; if (CHAR_MATCHES(enc, ptr, 'p')) return '&'; >> break; case 4 * MINBPC: switch (BYTE_TO_ASCII(enc, ptr)) < case 'q': ptr += MINBPC; if (CHAR_MATCHES(enc, ptr, 'u')) < ptr += MINBPC; if (CHAR_MATCHES(enc, ptr, 'o')) < ptr += MINBPC; if (CHAR_MATCHES(enc, ptr, 't')) return '"'; >> break; case 'a': ptr += MINBPC; if (CHAR_MATCHES(enc, ptr, 'p')) < ptr += MINBPC; if (CHAR_MATCHES(enc, ptr, 'o')) < ptr += MINBPC; if (CHAR_MATCHES(enc, ptr, 's')) return '\''; >> break; > > return 0; >
static int PTRFASTCALL PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) < int result = 0; /* skip &# */ ptr += 2*MINBPC(enc); if (CHAR_MATCHES(enc, ptr, ASCII_x)) < for (ptr += MINBPC(enc); !CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) < int c = BYTE_TO_ASCII(enc, ptr); switch (c) < case ASCII_0: case ASCII_1: case ASCII_2: case ASCII_3: case ASCII_4: case ASCII_5: case ASCII_6: case ASCII_7: case ASCII_8: case ASCII_9: result if (result >= 0x110000) return -1; > > else < for (; !CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) < int c = BYTE_TO_ASCII(enc, ptr); result *= 10; result += (c - ASCII_0); if (result >= 0x110000) return -1; > > // Some faggots compose mails with ancient control symbols in headers. // Libexpat tokenizer breaks on them (so far 'Form Feed' and 'DC2' were found). if (result == 0x0C) < result = 0x0A; >else if (result == 0x12) < result = ' '; >return checkCharRefNumber(result); >
static int PREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end, const char **badPtr) < ptr += MINBPC; end -= MINBPC; for (; ptr != end; ptr += MINBPC) < switch (BYTE_TYPE(enc, ptr)) < case BT_DIGIT: case BT_HEX: case BT_MINUS: case BT_APOS: case BT_LPAR: case BT_RPAR: case BT_PLUS: case BT_COMMA: case BT_SOL: case BT_EQUALS: case BT_QUEST: case BT_CR: case BT_LF: case BT_SEMI: case BT_EXCL: case BT_AST: case BT_PERCNT: case BT_NUM: break; case BT_S: if (CHAR_MATCHES(enc, ptr, '\t')) < *badPtr = ptr; return 0; >break; case BT_NAME: case BT_NMSTRT: if (!(BYTE_TO_ASCII(enc, ptr) & ~0x7f)) break; default: switch (BYTE_TO_ASCII(enc, ptr)) < case 0x24: /* $ */ case 0x40: /* @ */ break; default: *badPtr = ptr; return 0; >break; > > return 1; >
static int PTRFASTCALL PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) < int result = 0; UNUSED(enc); /* skip &# */ ptr += 2*MINBPC(enc); if (CHAR_MATCHES(enc, ptr, ASCII_x)) < for (ptr += MINBPC(enc); !CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) < int c = BYTE_TO_ASCII(enc, ptr); switch (c) < case ASCII_0: case ASCII_1: case ASCII_2: case ASCII_3: case ASCII_4: case ASCII_5: case ASCII_6: case ASCII_7: case ASCII_8: case ASCII_9: result if (result >= 0x110000) return -1; > > else < for (; !CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) < int c = BYTE_TO_ASCII(enc, ptr); result *= 10; result += (c - ASCII_0); if (result >= 0x110000) return -1; > > return checkCharRefNumber(result); >
static int PTRCALL PREFIX(checkPiTarget)(const ENCODING *enc, const char *ptr, const char *end, int *tokPtr) < int upper = 0; UNUSED(enc); *tokPtr = XML_TOK_PI; if (end - ptr != MINBPC(enc)*3) return 1; switch (BYTE_TO_ASCII(enc, ptr)) < case ASCII_x: break; case ASCII_X: upper = 1; break; default: return 1; >ptr += MINBPC(enc); switch (BYTE_TO_ASCII(enc, ptr)) < case ASCII_m: break; case ASCII_M: upper = 1; break; default: return 1; >ptr += MINBPC(enc); switch (BYTE_TO_ASCII(enc, ptr)) < case ASCII_l: break; case ASCII_L: upper = 1; break; default: return 1; >if (upper) return 0; *tokPtr = XML_TOK_XML_DECL; return 1; >
static int PREFIX(checkPiTarget)(const ENCODING *enc, const char *ptr, const char *end, int *tokPtr) < (void)enc; int upper = 0; *tokPtr = XML_TOK_PI; if (end - ptr != MINBPC*3) return 1; switch (BYTE_TO_ASCII(enc, ptr)) < case 'x': break; case 'X': upper = 1; break; default: return 1; >ptr += MINBPC; switch (BYTE_TO_ASCII(enc, ptr)) < case 'm': break; case 'M': upper = 1; break; default: return 1; >ptr += MINBPC; switch (BYTE_TO_ASCII(enc, ptr)) < case 'l': break; case 'L': upper = 1; break; default: return 1; >if (upper) return 0; *tokPtr = XML_TOK_XML_DECL; return 1; >
static int PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) < int result = 0; (void)enc; /* skip &# */ ptr += 2*MINBPC; if (CHAR_MATCHES(enc, ptr, 'x')) < for (ptr += MINBPC; !CHAR_MATCHES(enc, ptr, ';'); ptr += MINBPC) < int c = BYTE_TO_ASCII(enc, ptr); switch (c) < case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': result if (result >= 0x110000) return -1; > > else < for (; !CHAR_MATCHES(enc, ptr, ';'); ptr += MINBPC) < int c = BYTE_TO_ASCII(enc, ptr); result *= 10; result += (c - '0'); if (result >= 0x110000) return -1; > > return checkCharRefNumber(result); >
static int PTRCALL PREFIX (getAtts) (const ENCODING * enc, const char *ptr, int attsMax, ATTRIBUTE * atts) < enum < other, inName, inValue >state = inName; int nAtts = 0; int open = 0; /* defined when state == inValue; initialization just to shut up compilers */ for (ptr += MINBPC (enc);; ptr += MINBPC (enc)) < switch (BYTE_TYPE (enc, ptr)) < #define START_NAME \ if (state == other) < \ if (nAtts < attsMax) < \ atts[nAtts].name = ptr; \ atts[nAtts].normalized = 1; \ >\ state = inName; \ > #define LEAD_CASE(n) \ case BT_LEAD ## n: START_NAME ptr += (n - MINBPC(enc)); break; LEAD_CASE (2) LEAD_CASE (3) LEAD_CASE (4) #undef LEAD_CASE case BT_NONASCII: case BT_NMSTRT: case BT_HEX: START_NAME break; #undef START_NAME case BT_QUOT: if (state != inValue) < if (nAtts < attsMax) atts[nAtts].valuePtr = ptr + MINBPC (enc); state = inValue; open = BT_QUOT; >else if (open == BT_QUOT) < state = other; if (nAtts < attsMax) atts[nAtts].valueEnd = ptr; nAtts++; >break; case BT_APOS: if (state != inValue) < if (nAtts < attsMax) atts[nAtts].valuePtr = ptr + MINBPC (enc); state = inValue; open = BT_APOS; >else if (open == BT_APOS) < state = other; if (nAtts < attsMax) atts[nAtts].valueEnd = ptr; nAtts++; >break; case BT_AMP: if (nAtts < attsMax) atts[nAtts].normalized = 0; break; case BT_S: if (state == inName) state = other; else if (state == inValue && nAtts < attsMax && atts[nAtts].normalized && (ptr == atts[nAtts].valuePtr || BYTE_TO_ASCII (enc, ptr) != ASCII_SPACE || BYTE_TO_ASCII (enc, ptr + MINBPC (enc)) == ASCII_SPACE || BYTE_TYPE (enc, ptr + MINBPC (enc)) == open)) atts[nAtts].normalized = 0; break; case BT_CR: case BT_LF: /* This case ensures that the first attribute name is counted Apart from that we could just change state on the quote. */ if (state == inName) state = other; else if (state == inValue && nAtts < attsMax) atts[nAtts].normalized = 0; break; case BT_GT: case BT_SOL: if (state != inValue) return nAtts; break; default: break; >> /* not reached */ >

Источник

Читайте также:  Collection filters in java
Оцените статью