5632
Комментарий: Правка описания заголовка WAV
|
← Версия 4 от 2021-12-01 04:02:48 ⇥
6355
|
Удаления помечены так. | Добавления помечены так. |
Строка 2: | Строка 2: |
{{{#!wiki caution '''TODO''' Пример к '''Задача_1''' как-то обыграть в тестере }}} |
|
Строка 7: | Строка 11: |
* <!> Задача_1: ввести со стандартного ввода и вывести на стандартный вывод бинарные данные, первый байт которых — это количество равных (±1 байт) частей, на которые нужно разделить остальной ввод, отсортировать эти части между собой по возрастанию, и вывести на стандартный вывод (вместе со стартовым байтом вначале) | * <!> '''Задача_1:''' * Ввести со стандартного ввода и вывести на стандартный вывод бинарные данные, первый байт которых — это количество равных (±1 байт) частей, на которые нужно разделить остальной ввод, отсортировать эти части между собой по возрастанию, и вывести на стандартный вывод (вместе со стартовым байтом вначале). |
Строка 11: | Строка 16: |
{{{ $ echo -n qwerqwerqwerqwerqwerqwer | python3 sortb.py |
* Пример вызова (под bash): `$ echo -n <текст> | python3 sortb.py` '''Input:''' {{{ qwerqwerqwerqwerqwerqwer }}} '''Output:''' {{{ |
Строка 14: | Строка 26: |
}}} | }}} |
Строка 20: | Строка 32: |
* <!> Задача_2: написать перекодировщик в `UTF8` для следующей ситуации: * был текст на русском в кодировке `CP1251` * этот текст был перекодирован в `UTF8` как если бы он был в кодировке `latin1` (типичная ситуация с mp3 тегами ID3v1) * На входе — что-то типа «"áûë òåêñò íà ðóññêîì â êîäèðîâêå"» |
* <!> '''Задача_2:''' * Написать перекодировщик в `UTF8` для следующей ситуации: * был текст на русском в кодировке `CP1251` * этот текст был перекодирован в `UTF8` как если бы он был в кодировке `latin1` (типичная ситуация с mp3 тегами ID3v1) * На входе — что-то типа `áûë òåêñò íà ðóññêîì â êîäèðîâêå` |
Строка 27: | Строка 40: |
'''Input:''' {{{ áûë òåêñò íà ðóññêîì â êîäèðîâêå }}} '''Output:''' {{{ был текст на русском в кодировке }}} |
|
Строка 37: | Строка 60: |
* <!> Задача_3: Вывести заголовок [[http://www.topherlee.com/software/pcm-tut-wavformat.html|wav-файла]] (не весь, нужные поля отмечены (./) ) * `Size=…, Type=…, Channels=…, Rate=…, Bits=…, Data size=…` * если это не WAV (проверить строковые маркеры), вывести "NO" ||Positions '''off-by-1'''||Sample Value||Description|| ||1 - 4||"RIFF"||Marks the file as a riff file. Characters are each 1 byte long.|| || (./) 5 - 8||File size (integer)||Size of the overall file in bytes - 4 bytes (32-bit integer). Typically, you'd fill this in after creation.|| ||9 -12||"WAVE"||File Type Header. For our purposes, it always equals "WAVE".|| ||13-16||"fmt "||Format chunk marker. Includes trailing null|| ||17-20||16||Length of format data as listed above|| || (./) 21-22||1||Type of format (1 is PCM) - 2 byte integer|| || (./) 23-24||2||Number of Channels - 2 byte integer|| || (./) 25-28||44100||Sample Rate - 32 byte integer. Common values are 44100 (CD), 48000 (DAT). Sample Rate = Number of Samples per second, or Hertz.|| ||29-32||176400||(Sample Rate * BitsPerSample * Channels) / 8.|| ||33-34||4||(BitsPerSample * Channels) / 8.1 - 8 bit mono2 - 8 bit stereo/16 bit mono4 - 16 bit stereo|| || (./) 35-36||16||Bits per sample|| ||37-40||"data"||"data" chunk header. Marks the beginning of the data section.|| || (./) 41-44||File size (data)||Size of the data section.|| * [[attachment:phone.wav]] → |
* <!> '''Задача_3:''' * Вывести заголовок [[http://www.topherlee.com/software/pcm-tut-wavformat.html|wav-файла]] (не весь, нужные поля отмечены (./) ) * `Size=…, Type=…, Channels=…, Rate=…, Bits=…, Data size=…` * если это не WAV (проверить строковые маркеры), вывести "NO" * Сделать ''минимум три'' теста: 1. Успешный (настоящий wav) 1. Неуспешный (заголовок не распознаётся, например, потому что сам файл ''короче'' заголовка) 1. Неуспешный (заголовок прочтён, но строковые маркеры не совпадают) * Структура wav-файла: ||Positions '''off-by-1'''||Sample Value||Description|| ||1 - 4||"RIFF"||Marks the file as a riff file. Characters are each 1 byte long.|| || (./) 5 - 8||File size (integer)||Size of the overall file in bytes - 4 bytes (32-bit integer). Typically, you'd fill this in after creation.|| ||9 -12||"WAVE"||File Type Header. For our purposes, it always equals "WAVE".|| ||13-16||"fmt "||Format chunk marker. Includes trailing null|| ||17-20||16||Length of format data as listed above|| || (./) 21-22||1||Type of format (1 is PCM) - 2 byte integer|| || (./) 23-24||2||Number of Channels - 2 byte integer|| || (./) 25-28||44100||Sample Rate - 32 byte integer. Common values are 44100 (CD), 48000 (DAT). Sample Rate = Number of Samples per second, or Hertz.|| ||29-32||176400||(Sample Rate * BitsPerSample * Channels) / 8.|| ||33-34||4||(BitsPerSample * Channels) / 8.1 - 8 bit mono2 - 8 bit stereo/16 bit mono4 - 16 bit stereo|| || (./) 35-36||16||Bits per sample|| ||37-40||"data"||"data" chunk header. Marks the beginning of the data section.|| || (./) 41-44||File size (data)||Size of the data section.|| '''Input (1):''' [[attachment:phone.wav]] '''Output (1):''' |
Строка 58: | Строка 92: |
}}} * Сделать ''минимум три'' теста: 1. Успешный (настоящий wav) 1. Неуспешный (заголовок не распознаётся, например, потому что сам файл ''короче'' заголовка) 1. Неуспешный (заголовок прочтён, но строковые маркеры не совпадают) |
}}} '''Input (2):''' [[https://lvk.cs.msu.su/sites/all/themes/professional_theme/logo_msu.svg|logo_msu.svg]] '''Output (2):''' {{{ NO }}} |
11.25 Работа с файлами
TODO Пример к Задача_1 как-то обыграть в тестере
Просто файлы
- текстовые и бинарные файлы (остальное вроде бы очевидно)
поменять местами половины бинарного файла
- Подготовка к Задаче_1. Программе в качестве параметров передаётся имя бинарного файла и количество «равных» по размеру (±1 байт) частей, на которые его надо разделить. Необходимо отсортировать эти части по возрастанию и записать обратно в файл
Задача_1:
- Ввести со стандартного ввода и вывести на стандартный вывод бинарные данные, первый байт которых — это количество равных (±1 байт) частей, на которые нужно разделить остальной ввод, отсортировать эти части между собой по возрастанию, и вывести на стандартный вывод (вместе со стартовым байтом вначале).
Бинарное чтение / запись — из потока sys.stdin.buffer и в sys.stdout.buffer
- Размер частей вычисляется динамически (если они неравны, пускай Питон сам округляет) по формуле i*L/N …(i+1)*L/N, где i — номер части, L — размер хвоста файла, а N — количество частей
Минимум по одному тесту на три случая: размер хвоста кратен, не кратен N, меньше N (тогда некоторые части просто пустые)
Пример вызова (под bash): $ echo -n <текст> | python3 sortb.py
Input:
qwerqwerqwerqwerqwerqwer
Output:
qeeeeeeqqqqqrrrrrrwwwwww
Кодировки
- отличие кодировок снаружи от unicode внутри Python
encdode().decode()
добыть бнопню, бмхлюмхэ и охрюмхе (cp1251 и koi8-r)
Задача_2:
Написать перекодировщик в UTF8 для следующей ситуации:
был текст на русском в кодировке CP1251
этот текст был перекодирован в UTF8 как если бы он был в кодировке latin1 (типичная ситуация с mp3 тегами ID3v1)
На входе — что-то типа áûë òåêñò íà ðóññêîì â êîäèðîâêå
- На выходе — русский текст
- Несоответствующие кодировке символы заменять на «"?"» (что .decode/encode умеет сам)
- Минимум по одному тесту на два случая: есть или нет несоответствующих символов
Input:
áûë òåêñò íà ðóññêîì â êîäèðîâêå
Output:
был текст на русском в кодировке
Сериализация
(если успеем)
- простые примеры dump()/load()
поглядеть глазками protocol=0
Типизированные бинарные файлы
- применение, язык описания структур
Заполнить двоичный файл 10-ю случайными парами { float, int }
Задача_3:
Вывести заголовок wav-файла (не весь, нужные поля отмечены )
Size=…, Type=…, Channels=…, Rate=…, Bits=…, Data size=…
- если это не WAV (проверить строковые маркеры), вывести "NO"
Сделать минимум три теста:
- Успешный (настоящий wav)
Неуспешный (заголовок не распознаётся, например, потому что сам файл короче заголовка)
- Неуспешный (заголовок прочтён, но строковые маркеры не совпадают)
- Структура wav-файла:
Positions off-by-1
Sample Value
Description
1 - 4
"RIFF"
Marks the file as a riff file. Characters are each 1 byte long.
5 - 8
File size (integer)
Size of the overall file in bytes - 4 bytes (32-bit integer). Typically, you'd fill this in after creation.
9 -12
"WAVE"
File Type Header. For our purposes, it always equals "WAVE".
13-16
"fmt "
Format chunk marker. Includes trailing null
17-20
16
Length of format data as listed above
21-22
1
Type of format (1 is PCM) - 2 byte integer
23-24
2
Number of Channels - 2 byte integer
25-28
44100
Sample Rate - 32 byte integer. Common values are 44100 (CD), 48000 (DAT). Sample Rate = Number of Samples per second, or Hertz.
29-32
176400
(Sample Rate * BitsPerSample * Channels) / 8.
33-34
4
(BitsPerSample * Channels) / 8.1 - 8 bit mono2 - 8 bit stereo/16 bit mono4 - 16 bit stereo
35-36
16
Bits per sample
37-40
"data"
"data" chunk header. Marks the beginning of the data section.
41-44
File size (data)
Size of the data section.
Input (1):
Output (1):
Size=108208, Type=1, Channels=2, Rate=44100, Bits=16, Data size=108172
Input (2):
Output (2):
NO