Страницы

Поиск по вопросам

среда, 12 февраля 2020 г.

Узнать количество символов в массиве BYTE

#c #windows


Узнать количество символов в строке можно так:

TCHAR* someStr = "Hello World!";
size_t sizeStr = strlen(someStr);


Как узнать количество символов в массиве байт, например:

BYTE * someByte = "\xFF\xAA\x55";
size_t sizeByte = strlen((TCHAR*)someByte );


Работает не корректно, особенно при юникоде. Как быть?
    


Ответы

Ответ 1



Для разных типов строк следует использовать разные функции. С описанием можно ознакомиться в документации на MSDN

Ответ 2



Юникод бывает разный: мультибайтный (utf-8) Для него подойдет стандартный ASCII-Z подход и класс std::string Но при этом, будет считаться не длина строки в символах, а количество байт. Работа на уровне символов с utf-8 стандартом C++ не поддерживается - нужны внешние библиотеки. двухбайтный (utf-16) Тут поможет тип wchar_t* и класс std::wstring, остальное по аналогии с ASCII-Z, только признаком конца строки будет слово (16 бит), равное 0. Для этих строк существуют аналоги восьмибитных функций из стандартной библиотеки C, для измерения длины - wcslen(), например При этом, работа этих аналогов будет происходить как раз на уровне символов. четырехбайтный (utf-32) стандартной библиотекой C++ не поддерживается.

Ответ 3



wchar_t* wstr1 = L"Count."; wprintf(L"Length of '%s' : %d\n", wstr1, wcslen(wstr1) );

Ответ 4



Ты задаешь этот вопрос, потому что не понимаешь базовых вещей. Надо для начала понять, что такое обычная строка Видишь указатель = 4 байта, которые указывают на массив данных на самом деле. strlen() - работает так, он бежит по массиву и ищет \0 (конец строки), т.е. strlen() - это просто функция подсчета элементов. Дальше еще интереснее.. Если ты говоришь об юникоде. То у него структура совсем другая. Обычно используется вспомогательный класс, например CString. Его структура приблизительно такая. char (для символьных строк ANSI). wchar_t (для символьных строк в юникоде). TCHAR (и для символьных строк ANSI и юникод). Т.е. видишь что? Это разные совсем структуры. И у них разная функция. Для wchar_t(юникод) используй wslen() как то так что ли называется.. Кстати еще у компилятора есть, деректива в настройках. Какой тип будет по умолчанию ansi или unicode. Советую ставить unicode. Насчет твоего примера. Он изначально сделан криво. Скорее всего ты либо получаешь из сокета строку, либо из файла читаешь. Читай в буфер, а сразу в нормальную структуру, какую нибудь CString.

Комментариев нет:

Отправить комментарий