|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
|
|
Зачем в начале файла utf-16 нужны байты 0XFF и 0XFE?27.10.2016, 15:54. Показов 6759. Ответов 18
Метки нет (Все метки)
Друзья! Хоть убей не пойму, зачем перед строкой нужны байты 0xFF 0xFE. Везде можно прочесть, что они нужны, чтобы указать считывающему устройству (в дальнейшем СУ), чтобы указать, как считывать байты строки- прямым порядком, или обратным.
Но если попытаться вникнуть, как это сделал я, увидим, что эти байты сами по себе и то, в каком порядке они написаны ВООБЩЕ не влияют на результат считывания. А раз так зачем они нужны? Разберём два случая - когда СУ считывает байты в прямом порядке (так работает большинство процессоров) и в обратном (так работает меньшинство процессоров). В каждом случае сперва разберём наличие байтов 0xFF 0xFE впереди строки и их отсутствие. Результат будет одинаков. ++++++++++++++++++++++++++++++++++++++++ СУ считывает строку в прямом порядке 1) Имеем строку 0XFF 0XFE 0XC9 0XDB 0XFF 0XDC -Сперва считается и сформируется число 0XFEFF -СУ сделает вывод, что строка закродирована прямым порядком. -А раз она закодирована прямым порядком, то умный СУ считает и сформирует числа 0XDBC9 и 0XDCFF 2) Имеем строку 0XC9 0XDB 0XFF 0XDC (без 0XFF и 0XFE) -CУ считывает числа в обратном порядке и получает 0XDBC9 и 0XDCFF, безо всяких, заметьте 0XFF и 0XFE Ну и зачем они нужны? ++++++++++++++++++++++++++++++++++++++++ СУ считывает строку в обратном порядке 1) Имеем строку 0XFF 0XFE 0XC9 0XDB 0XFF 0XDC -Сперва считается и сформируется число 0XFFFE -СУ сделает вывод, что строка закродирована обратным порядком. -А раз она закодирована обратным порядком, то умный СУ считает и сформирует числа 0XC9DB и 0XFFDC 2) Имеем строку 0XC9 0XDB 0XFF 0XDC (без 0XFF и 0XFE) -CУ считывает числа в обратном порядке и получает 0XC9DB и 0XFFDC, безо всяких, заметьте 0XFF и 0XFE Ну и зачем они нужны? ++++++++++++++++++++++++++++++++++++++++ Во втором случае числа будут считаны неправильно. Но это абсолютно не зависит от наличия впереди строки байтов 0XFF и 0XFE, а зависит только от того, как считывает строки СУ, в прямом порядке или в обратном. Ну и зачем нужны эти байты, 0XFF и 0XFE? Спасибо, кто откликнется.
0
|
|
| 27.10.2016, 15:54 | |
|
Ответы с готовыми решениями:
18
'utf-8' codec can't decode byte 0xff in position 0: invalid start byte Кодирование строк unicode в байты utf-8 Отличить числовые байты от строки utf-8 |
|
Модератор
3132 / 2279 / 469
Регистрация: 26.03.2015
Сообщений: 8,870
|
|
| 27.10.2016, 16:49 | |
|
Строку "FF FE C9 DB" система считает как "FFFE C9DB" или как "FEFF DBC9". Если система считает "FFFE C9DB", то она развернёт порядок и получит "FEFF DBC9". То есть, в любом случае система получит один и тот же текст ("DBC9").
Без метки система могла бы получить как "DBC9", так и "C9DB".
1
|
|
| 27.10.2016, 17:11 | |
|
0
|
|
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
|
|||
| 27.10.2016, 22:50 [ТС] | |||
|
Добавлено через 48 минут 1) У нас есть строка "C9DB" и мы допускаем, что СУ её именно так может интерпретировать, как число 0XC9DB - ваша же мысль? То есть допускаем, что CУ может считать 0XC9 в старший байт числа, а 0XDB в младший байт числа. Если так произойдёт, то это будет катастрофа. 2) Как этого избежать? А вот нужно, чтобы первое число (вначале) было бы 0XFEFF, тогда СУ прочтёт его и поймёт, что считывать дальнейшую строку надо в прямом порядке. 3) Как расположить байты впереди числа, чтобы СУ интерпретировало бы их как 0XFEFF? Их надо расположить так: 0XFE 0XFF 0XC9 0XDB. Это важно очень, вы с этим согласны? 4) Тогда у нас СУ сперва получает число 0XFEFF (у нас именно такое СУ, см п.1), потом видит, что числа-то в прямом порядке нужно считывать, ПЕРЕОБУВАЕТСЯ НА ХОДУ и продолжает считывать их, но уже в прямом порядке. 5) Получается, строка 0XFE 0XFF 0XC9 0XDB, в которой правильно закодировано число 0XDBC9. Но мы-то для того и ставим метку впереди строки, что знаем- СУ разные. И другое СУ, которое ИЗНАЧАЛЬНО считывает числа прямым порядком, получит число 0XFFFE (так ведь?), поймёт, что строка закодирована обратным порядком и просто-напросто следующее число, которое будет считано, будет число 0XC9DB Воти используй после этого BOM.
0
|
|||
|
Ушел с форума
|
||||||
| 27.10.2016, 23:34 | ||||||
|
kravam, я тебе встречную задачку задам.
Вот есть у нас текст в UTF-16, представленный такой последовательностью байт:
Может быть это U+041D (Кириллическая "Н")? А может, это U+1D04 (Латинская "c")? Используя BOM, твое СУ сразу определит правильный порядок байт - Big Endian или Little Endian.
1
|
||||||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
|
||
| 28.10.2016, 00:10 [ТС] | ||
|
Но делать нечего.Пошли ещё раз. Хотя я это всё описывал на примере числа 0XDBC9, но если вам больше нравится число 0x1D04... 1) Имеем число 0x1D04. Записываем его в строку в прямом порядке, то есть: 0x04 0x1D 2) Теперь я подумал и решил, что вы правы, да, нужно как-то показать СУ, что это порядок ПРЯМОЙ 3) Как указать? Ну, нужно написать впереди числа 0XFE, 0XFF. Получим строку 0XFE 0XFF 0x04 0x1D. Тогда придёт СУ_N_1_которое_читает_числа_в_обратном_п орядке, прочтёт число 0XFEFF, сообразит, что читать- то нужно прямом, оказывается! И прочтёт следубщее число как полагается, то есть 0X1D04. Чудненько 4) А потом мы скормим эту строку СУ_N_2_которое_читает_числа_в_прямом_пор ядке, оно считает число 0XFFFE, видит- а порядок-то, обратный, оказывается и считает следующее число как 0X041D И это будет катастрофа. А теперь вопрос: много нам помог маркер порядка байт? Ну, когда "то" СУ, он помогает, а когда "не то", то не помогает. Но мы-то должны рассчитывать что строку будут обрабатывать любые СУ. Конечно, в это всё можно и не вникать, а можно просто спросить, как я буду различать числа без BOM. Я просто хочу сказать, что мы и с BOM-ом то не особо их различаем.
0
|
||
|
Модератор
3132 / 2279 / 469
Регистрация: 26.03.2015
Сообщений: 8,870
|
||
| 28.10.2016, 00:37 | ||
|
1
|
||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
|
||
| 28.10.2016, 00:41 [ТС] | ||
|
0
|
||
|
Модератор
3132 / 2279 / 469
Регистрация: 26.03.2015
Сообщений: 8,870
|
|||
| 28.10.2016, 01:12 | |||
|
Повторите свой пример в терминах "старший-младший" и "младший-старший". Добавлено через 11 минут Попробую ещё раз. Система читает первые два байта. Если она прочитала FEFF, то значит она читает в том же порядке, в котором написано. Замечательно. Продолжаем читать в том же порядке. Если она прочитала FFFE, то значит она читает в обратном порядке. Значит нужно переставлять местами старший и младший байты в прочитанном.
1
|
|||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
|
|||
| 28.10.2016, 01:21 [ТС] | |||
|
1) Имеем число 0x1D04. Записываем его в строку в порядке "младший-старший", то есть: 0x04 0x1D 2) Теперь я подумал и решил, что вы правы, да, нужно как-то показать СУ, что это порядок "младший-старший". То есть чтобы СУ знало- ага, сперва идёт младший байт числа, а потом старший. 3) Как указать? Ну, нужно написать впереди числа 0XFE, 0XFF. Получим строку 0XFE 0XFF 0x04 0x1D. Тогда придёт СУ_N_1_которое_читает_числа_в_порядке_старший_младший, прочтёт число 0XFEFF, сообразит, что читать- то нужно в порядке "младший-старший", оказывается! И прочтёт следующее число как полагается, то есть 0X1D04. Чудненько 4) А потом мы скормим эту строку СУ_N_2_которое_читает_числа_в_порядке_младший старший, оно считает число 0XFFFE, видит- а порядок-то, "старший_младший", оказывается и считает следующее число как 0X041D И это будет катастрофа. Добавлено через 3 минуты
0
|
|||
|
Модератор
3132 / 2279 / 469
Регистрация: 26.03.2015
Сообщений: 8,870
|
||
| 28.10.2016, 01:44 | ||
Сообщение было отмечено kravam как решение
РешениеНужно написать впереди FEFF. Если СУ пишет младший-старший, то она запишет 0xFF 0xFE. Добавлено через 9 минут 3) Как указать? Ну, нужно написать впереди числа 0XFEFF. Получим строку 0XFF 0XFE 0x04 0x1D (младший-старший, младший FF, старший FE). Тогда придёт СУ_N_1_которое_читает_числа_в_порядке_ст арший_младший, прочтёт число 0XFFFE, сообразит, что читать- то нужно в обратном порядке ("младший-старший"), оказывается! И прочтёт следующее число как полагается, то есть 0X1D04. Чудненько 4) А потом мы скормим эту строку СУ_N_2_которое_читает_числа_в_порядке_мл адший старший, оно считает число 0XFEFF, видит- а порядок-то, правильный И это будет
1
|
||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
|
|
| 28.10.2016, 01:45 [ТС] | |
|
delete
0
|
|
|
Ушел с форума
|
||
| 28.10.2016, 09:18 | ||
|
СУ_N_1: читаю 0xFF, затем 0xFE, значит это Little Endian. СУ_N_2: читаю 0xFF, затем 0xFE, тоже Little Endian и все тоже ок. В этом случае то, что оба СУ читают 2-байтовые числа по-разному, не играет никакой роли.
0
|
||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
|
|
| 28.10.2016, 15:10 [ТС] | |
|
Ну ясно всё. В общем-то, если вникнуть в мой первый пост, то там можно было найти ошибку в рассуждениях. Вникнуть это значит внимательно прочесть. Я стараюсь быть понятным, можно было уделить время.
Не по теме: Во-первых, я там в п.1.2 опечатался и написал Фактическая ошибка была в пункте 2: -СУ сделает вывод, что строка закодирована обратным порядком. Конечно, это не так. Как указал Shamil1, это не значит, что строка не закодирована обратным порядком. Это значит что ПОРЯДОК СЧИТЫВАНИЯ НУЖНО МЕНЯТЬ. Теперь это ясно. +++++++++++++++++++++++++++++++++++++++ Но я тоже не с потолка взял моё ошибочное утверждение, а здесь: При считывании, если вместо U+FEFF считалось U+FFFE, значит порядок байтов обратный, Википедия. Теперь понятно, что порядок байт не обратный, а ОБРАТНЫЙ ОТНОСИТЕЛЬНО ТОГО, КАКИМ ПОЛЬЗУЕТСЯ СУ. Это разные определения обратных порядков и они дают разные результаты. Конечно при разборе BOM нужно пользоваться таким: "Если BOM определило, что порядок обратный, то значит нужно менять порядок считывания" Не по теме: Тем, кто даёт первые попавшиеся ссыли- сами-то читаем, что там написано? +++++++++++++++++++++++++++++++++++++++ Ну и немного по терминам. Считаю определения "младший-старший", "Little Endian", "прямой порядок" эквивалентными, равно как и "старший-старший", "Big Endian", "обратный порядок" BOM же стоит немного особняком от этого всего. Он не определяет не то, не другое и не третье. BOM определяет, нужно ли менять порядок считывания или нет. То есть если он считал слева направо, то нужно ли дальше также считывать слева направо или начать считывать справа налево.
0
|
|
|
|
||
| 28.10.2016, 16:43 | ||
|
kravam, если Вас путает прямой-обратный, при отсутствии точки отсчёта, думайте только о:
Добавлено через 1 минуту kravam, у Вас такая куча ошибок в утверждениях, что вникать бессмысленно. Проще объяснить матчасть. Добавлено через 14 минут BOM используется с основном для того, чтобы отличить текст Little-Endian и Big-Endian. http://www.unicode.org/faq/utf_bom.html#BOM
0
|
||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
|
||||
| 28.10.2016, 17:12 [ТС] | ||||
|
Не по теме:
Поэтому я и стараюсь их формализировать, написать тезисно как-то, сделать удобочитаемыми. Их немного. Находим цифру 1, читаем. Согласны? Согласны. Переходим к цифре 2, читаем. Согласны? Согласны. Переходим к цифре 3. Согласны? Не согласны. Что делаем? Либо объясняем ПУНКТ 3, либо машем рукой и в очередной раз пишем, что без BOM СУ не может правильно интерпретировать считанные байты.
0
|
||||
|
|
|
| 28.10.2016, 19:04 | |
|
Предположим, что из начала текстового файла читается 16-битное беззнаковое целое число.
Если текст закодирован в UTF-16LE, а система LE, то число = 0xFEFF. Если текст закодирован в UTF-16BE, а система LE, то число = 0xFFFE. Если текст закодирован в UTF-16LE, а система BE, то число = 0xFFFE. Если текст закодирован в UTF-16BE, а система BE, то число = 0xFEFF. BOM это символ U+FEFF. Если слово считалось такое же, дальше можно считывать остальные слова напрямую. Если нет, надо переворачивать. Добавлено через 21 минуту kravam, немного поправил Ваш поток: ++++++++++++++++++++++++++++++++++++++++ СУ считывает строку в 1) Имеем строку [FF FE] [C9 DB] [FF DC] -Сперва считается и сформируется число FEFF -СУ сделает вывод, что строка закодирована -А раз она закодирована 2) Имеем строку [C9 DB] [FF DC] (без FF и FE) -CУ считывает числа в обратном порядке и получает DBC9 и DCFF, безо всяких, заметьте FF и FE ++++++++++++++++++++++++++++++++++++++++ СУ считывает строку в 1) Имеем строку [FF FE] [C9 DB] [FF DC] -Сперва считается и сформируется число FFFE -СУ сделает вывод, что строка закодирована -А раз она закодирована 2) Имеем строку [C9 DB] [FF DC] (без FF и FE) -CУ считывает числа в обратном порядке и получает C9DB и FFDC, безо всяких, заметьте FF и FE. ++++++++++++++++++++++++++++++++++++++++ Добавлено через 1 минуту Предполагается, что коды символов равны DBC9 и DCFF, файл в LE, а не наоборот.
1
|
|
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
|
||||
| 28.10.2016, 20:10 [ТС] | ||||
|
Rius, всё верно, да. Так это я вот понял ночью ещё благодаря этому сообщению с тех пор я не спрашиваю, зачем нужен BOM
+++++++++++++++++++++++++++++++++++++++ ...А почему вы решили, что я не понял, так вот из-за этих вот моих слов, которые те же, что и ваши. Мысль-то одна, а слова разные просто. Только я опустил названия порядков LE и BE. А почему упустил? А потому, что допустил, что файл может быть изначально BE. В нашем примере: 0XFE 0XFF 0X1D 0X04 Тогда в случае, если СУ считывает порядком LE, ваша последняя фраза будет звучать так:
1
|
||||
| 28.10.2016, 20:10 | |
|
Помогаю со студенческими работами здесь
19
Написать программу, которая бы считывала из входного файла байты с N1 по N2 и с N3 по N4 и записывала эти байты в выходной файл Зачем в файлы записывать байты и что такое потоки вообще?
Зачем AND в начале MySQL запроса UTF-8 кодировка буквы "й", как эти байты перекодировать обратно в букву Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|