Сколько байт в строке
Перейти к содержимому

Сколько байт в строке

  • автор:

Строка в кодировке UTF-8

Преобразует входную строку в шестнадцатеричный, двоичный или десятичный дамп в кодировке UTF-8 и обратно из дампа в строку.

Калькулятор ниже можно использовать для преобразования строки в шестнадцатеричный / двоичный или десятичный дамп в кодировке utf-8. Калькулятор определяет количество символов в строке, число символов занимающих один, два, три или четыре байта в кодировке utf8, а также общее число байт в тексте, закодированном utf8.
Немного информации о представлении строк в Юникоде и uft-8 можно найти под калькуляторами.

Строка в UTF-8

Входной текст
Выводить как
Число разрядов в строке
Разделять строку
Разделитель
Рассчитать
Строка в UTF-8
Количество символов
Количество байт
Количество символов длины 1,2,3,4 байта
Ссылка Сохранить Виджет

Следующий калькулятор выполняет обратное преобразование из строкового дампа строки в кодировке utf-8 в строку. Основание представления закодированной строки (16, 10 или 2 ) калькулятор может определить автоматически. В десятичном дампе обязательно разбиение строки на байты. В качестве разделителя можно использовать любой символ, например пробел.

UTF-8 в строку

Формат данных
Рассчитать
Ссылка Сохранить Виджет

Предыстория кодирования символов в строке

В старые добрые времена, когда компьютеры были ламповыми смартфонов не было, а объем памяти персональных компьютеров порой не превышал и одного мегабайта, для кодирования одного символа в строке хватало всего лишь одного байта. Первую «половину» байта занимали цифры, символы латинского алфавита, знаки пунктуации и другие полезные символы, все вместе известные как таблица ASCII. Вторую половину разработчики захватили для кодирования символов национальных языков. Захват происходил сразу с разных концов, независимыми специалистами, что привело к существованию нескольких различных кодировок даже для одного и того же языка (например для кириллицы существуют такие одно-байтовые кодировки: КОИ-8, CP866, ISO 8859-5, Windows-1251). Одно-байтовая запись любого символа была простой и очень удобной для разработчиков программ. Однако наличие различных кодировок порождало постоянные проблемы у пользователей: для корректного отображения текста нужно было знать в какой он кодировке , для каждой кодировки нужно иметь отдельные шрифты. Кроме того, выяснилось, что в мире существуют языки, где число символов заметно больше, чем 256, соответственно в один байт все символы этих языков уже не могли поместиться.

Юникод

Для решения вышеописанных проблем в 1991-м году придумали стандарт, описывающий универсальный набор всех символов — Юникод. В первой версии Юникода, насчитывалось 7161 символов 1 . Для кодирования этого числа символов достаточно 2-х байтов, что привело к расцвету 2-х байтовой кодировки UTF-16 в операционных системах и некоторых языках программирования. Оперировать двух-байтовыми символами в программах оказалось ни чуть не сложнее, чем одно-байтовыми. Однако радость разработчиков продолжалась всего 10 лет, версия 3.1 стандарта Unicode насчитывает в 13 раз больше символов, чем первая. Общее число символов достигло 94 205 и для их кодирования уже мало двух байтов. К моменту написания этой статьи последний стандарт Юникода 13.0 содержит 143 859 символов, и работы по добавлению новых символов не прекращаются. Простейшее решение проблемы — снова удвоить число байт для представления символов. Для этого имеется кодировка UTF-32, позволяющая закодировать 2 147 483 648 позиций.

UTF-8

Однако, всему есть предел. Расходовать 4 байта на один символ показалось слишком расточительным. Поэтому UTF-32 не стала столь популярной, как UTF-16. Вместо этого, сейчас наиболее популярна кодировка с переменной длиной символа UTF-8. UTF-8 появилась в 1992-м году и ранее использовалась преимущественно в unix-системах. Большое достоинство ее заключается в том, что текст, набранный латиницей, полностью совместим с 7-битной кодировкой ASCII, применяемой с 1963-года.
При помощи кодировки UTF-8 можно закодировать 2 097 152 символов, что почти в 15 раз больше текущего объема символов, описанных в Юникоде.
Для определения количества байт, требуемых для кодировки символа, используется от одного до 5-и старших бит 2 первого байта:

  • 0 — однобайтовый символ, соответствующий таблице ASCII, например Символ доллара
  • 110 — двух-байтовый символ, например Символ фунта
  • 1110 — трех-байтовый символ, например Символ евро
  • 11110 — четырех-байтовый символ, например Смайлик

Каждый последующий байт содержит 2-битовый маркер дополнительного байта: 10. Для получения позиции символа в Юникоде вспомогательные биты просто удаляются, оставшаяся битовая последовательность будет соответствовать номеру символа.

как узнать сколько байтов в hex строке

Подскажите как узнать сколько байтов в строке записанной в hex, есть необходимость валидировать ethereum кошелек, длинна каждого кошелька равно 20 байтам но как это реализовать на python не пойму пробовал так:

eth = 0xf8e1f68d15e0db4e31adaed3eb0a89c1513c6dd2 print(eth.bit_length()) 156 

что совсем не то что должно быть. Спасибо.
Отслеживать
задан 18 янв 2018 в 15:05
Alexandr Vasilenko Alexandr Vasilenko
366 2 2 серебряных знака 12 12 бронзовых знаков

у вас тут мешанина типов. В заголовке вы говорите о «hex строке». В коде у вас int объект из hex literal создаётся (в Питоне str и int это совсем разные вещи). Для которого вы количество [необходимых] бит выводите. Что у вас на входе? Что вы хотите на выходе точно? К примеру: «00» что у вас должно возвращать? 0 или 1 или 2?

18 янв 2018 в 15:12
Каждые два символа [A-F][0-9] представляют один байт. Так что длину строки делите на два
18 янв 2018 в 15:27

на входе у меня строка полученная из формы на сайте, посоветуйте как мне лучше поступить ?? print(hex(eth).__len__()) выводит 41, даже если я разделю на 2 получится 20,5 а должно быть 20

18 янв 2018 в 15:28
@AlexandrVasilenko а в приведенном коде у вас НЕ строка.
18 янв 2018 в 15:29

eth = «0x0d18B2a0901FF0048Cc36F7a6C2297FBb05B68e6» print(hex(int(eth,16)).__len__()) выводит все равно 41

18 янв 2018 в 15:33

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

>> eth = 'f8e1f68d15e0db4e31adaed3eb0a89c1513c6dd2' >> s = bytearray.fromhex(eth) >> print(s) bytearray(b'\xf8\xe1\xf6\x8d\x15\xe0\xdbN1\xad\xae\xd3\xeb\n\x89\xc1Q> len(s) 20 

При этом, если в строке будут невалидные hex-значения или будет нечётное число символов, то при конвертации получите ошибку. И это автоматически будет означать, что номер кошелька невалиден.

Если же ошибки не возникло и длина оказалась равна 20, то всё валидно.

Как Посчитать Размер Строки В Байтах?

У меня есть массив строк, которые я хочу добавить в множественное поле. Но поскольку поле ограничено размером 32 кб, то в случае слишком большого массива, можно потерять информацию. Подскажите как посчитать размер строк в байтах, хочется это сделать до того как добавлять в поле? Возможно это Len, но при добавлении в поле, размер поля увеличивается несоразмерно со строкой, поэтому не уверен. Знаю, что размер поля можно посчитать (Valuelength), но не хочется загружать систему, поскольку придется добавлять каждую ячейку в поле отдельно, а потом проверять ее размер.

savl

Lotus Team
28.10.2011 2 606 313 BIT 246
А RichText не подойдет?

garrick

Lotus Team
26.10.2009 1 352 151 BIT 203

Len — это длина строки в символах, размер каждого символа в байтах зависит от кодировки. Нужно длину строки умножить на кол-во байт в символе (2 или 4 не помню точно) в зависимости от от вашей кодировки.

Serduko

А RichText не подойдет?

Думал об этом, интерактивность сложно реализуема.

Len — это длина строки в символах, размер каждого символа в байтах зависит от кодировки. Нужно длину строки умножить на кол-во байт в символе (2 или 4 не помню точно) в зависимости от от вашей кодировки.

Ansi, один байт. Вероятно, все таки поле хранит доп. информацию, наверно, посчитать сколько строка займет места в поле невозможно без добавления.

garrick

Lotus Team
26.10.2009 1 352 151 BIT 203
Ansi — на сколько я понимаю, это только латинские буквы, у вас скорее всего unicode.

Serduko

Ansi — на сколько я понимаю, это только латинские буквы, у вас скорее всего unicode.
Ссылка скрыта от гостей

savl

Lotus Team
28.10.2011 2 606 313 BIT 246

Serduko
Интерактивность? Какого рода?
Если просто загнать и максимальная функциональность: редактирование, копирование, вставка. RT вполне подойдет.
Отображать в виде, поиск по значению в базе: не подойдет.
Если загонять в многозначное текстовое, я бы предварительно весь этот текст обработал: убрал бы пустые сроки, запрещенные символы(неразрывные пробелы, лишние пробелы и т.д.) Это часто бывает при вставке из email.
Есть еще вариант. подсчитать, но совсем дикий) Записать в файл по байтам весь текст и взвесить.
Txt файл хранит только текст, размер пустого файла: 11 байт (если не путаю), а размер пустого word 11Кб

И так, инетерсно, если текст окажется больше, что делать будете?

garrick

Lotus Team
26.10.2009 1 352 151 BIT 203
Думал об этом, интерактивность сложно реализуема.
Хранить XML в RTF поле? Удобно разбирать потом будет.

Serduko

Serduko
Интерактивность? Какого рода?
Если просто загнать и максимальная функциональность: редактирование, копирование, вставка. RT вполне подойдет.
Отображать в виде, поиск по значению в базе: не подойдет.
Если загонять в многозначное текстовое, я бы предварительно весь этот текст обработал: убрал бы пустые сроки, запрещенные символы(неразрывные пробелы, лишние пробелы и т.д.) Это часто бывает при вставке из email.
Есть еще вариант. подсчитать, но совсем дикий) Записать в файл по байтам весь текст и взвесить.
Txt файл хранит только текст, размер пустого файла: 11 байт (если не путаю), а размер пустого word 11Кб

И так, инетерсно, если текст окажется больше, что делать будете?

Это некоторое подобие реляционных таблиц. Строка обработана, удалены лишние символы и пр., содержит данные с разделителем.
Соответственно, программа активно работает с этими данными.

Если текст будет больше 32, то программа автоматически переносит его на следующее поле (количество полей — любое, просто передаю их в массиве в функцию), ну а если все равно не влазит, тогда массив строк обрезается и выдается ошибка (не критичная). Сейчас массив строк обрезаю «на глаз», но хотелось бы большей эффективности.

PS благодаря ООП, если будет связь с SQL, с мин затратами переведу на него.

Хранить XML в RTF поле? Удобно разбирать потом будет.

Хм., интересно. Вот только вопрос, как интерактивно менять данные в RT поле не сохраняя и не закрывая документ?

Паскаль. Сколько байт занимает переменная типа string[10]? 11? .

памяти может занимать столько, сколько позволит компилятор
вообще фактически 11 и 12 минимум.
Компилятор может выделить, и наверняка именно так и сделает, больше, например, с выравниванием по 4 байтовой границе будет по 12 байт.

Вот здесь разобран подробно String в Паскале
http://informatics.mccme. ru/moodle/mod/book/view.php?id=532&chapterid=246
(убрать пробел)
Честно, даже там всё сумбурно написано, так как действительно String не предназначен для того чтобы считать байты!
Могу вам только аналогию на Си описать, где всё просто и понятно
Любая строка должна заканчиваться 0-символом
Если в строке, например 10 символов, то для её хранения очень желательно выделять 11 байт!
Почему очень желательно, а не обязательно, да потому что если Вы понимаете про 0 символ, то Вы можете использовать свою функцию вывода, в которой, например, Вы предполагаете, что знаете размер массива и не тратить память на хранение 0-го символа. Но конечно в большинстве случаев это не удобно и легко приводит к ошибкам!
В Си строка это массив символов char (байтовых переменных) и для хранения строки в 10 байт, я должен создать массив в 11 элементов!
У Вас же string[ 10 ]! Вот так в Паскале: либо просто String либо String[число] . Когда просто string по умолчанию говорят про строку в 255 байт, а то, что памяти при этом выделяется 256 байт об этом, почему-то умалчивают! Кстати именно 256 байт первоначально, как круглое число! А уж 255 — это то что получилось!
Поэтому для Вашего примера string[ 10 ] строка должна содержать не более 9 символов!

Это очень просто выяснить:

type TS = string[10];
begin
Writeln(SizeOf(TS));
end.

Песни о Паскале — программирование для школьников и начинающих
Читайте главу 44

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *