
Презентация File Formats.pptx
- Количество слайдов: 46
Форматы файлов Андрей Гейн
Форматы
Форматы • Спецификации
Форматы • Спецификации • Определение формата
Форматы • Спецификации • Определение формата – Расширение
Форматы • Спецификации • Определение формата – Расширение – Magic numbers
Форматы • Спецификации • Определение формата – Расширение – Magic numbers – Meta-данные
Форматы • Спецификации • Определение формата – Расширение – Magic numbers – Meta-данные – MIME
Паттерны
Паттерны • Поточность
Паттерны • Поточность • Chunk
Паттерны • Поточность • Chunk • Указание размера
Паттерны • • Поточность Chunk Указание размера Резервация
Паттерны • • • Поточность Chunk Указание размера Резервация Теги
MIDI
MIDI • Запись
MIDI • Запись Заголовок Размер Данные
MIDI • Запись Заголовок Размер Данные 4 D 54 68 64 “MThd” 72 6 B “MTrk” 00 00 00 06 Размер записи 01 4 D 00 01 … Формат — 1 События 00 02 2 трека E 7 28 Временной интервал — 1 мс
MIDI • Событие
MIDI • Событие Время Статус-байт Данные
MIDI • Событие Время Статус-байт 00 FF Дополнительно Данные
MIDI • Событие Время 00 FF 00 01 02 03 04 05 Статус-байт Дополнительно Номер Текст Copyright Имя Инструмент Слова Данные
WAV
WAV • 52 49 46 46 • 70 C 0 0 B 00 • 57 41 56 45 “RIFF” Chunk size “WAVE”
WAV • • 52 49 46 46 70 C 0 0 B 00 57 41 56 45 66 6 D 74 20 10 00 01 00 02 00 “RIFF” Chunk size “WAVE” “fmt ” Subchunk 1 size Аудио-формат Моно/стерео
WAV • 64 61 74 61 • 4 C C 0 0 B 00 • … “data” Subchunk 2 size Данные
BMP
BMP • • 42 4 D B 8 C 5 5 A 00 00 00 36 00 00 00 “BM” Размер файла Резерв Смещение BITMAPINFOHEADER
Пишем свой парсер
Пишем свой парсер from struct import *
Пишем свой парсер from struct import * pack('i', 1000) b'xe 8x 03x 00'
Пишем свой парсер from struct import * pack('i', 1000) pack('h', 1000) b'xe 8x 03x 00' b'xe 8x 03'
Пишем свой парсер from struct import * pack('i', 1000) pack('h', 1000) pack('>h', 1000) b'xe 8x 03x 00' b'xe 8x 03' b'x 03xe 8'
Пишем свой парсер from struct import * pack('i', 1000) pack('h', 1000) pack('>h', 1000) pack('i', -1000) b'xe 8x 03x 00' b'xe 8x 03' b'x 03xe 8' b'x 18xfcxff'
Пишем свой парсер from struct import * pack('i', 1000) pack('h', 1000) pack('>h', 1000) pack('i', -1000) pack('q', 10**12) b'xe 8x 03x 00' b'xe 8x 03' b'x 03xe 8' b'x 18xfcxff' b'x 00x 10xa 5xd. .
Пишем свой парсер pack('c', b'a') pack('5 s', b'hello') b'a' b'hello'
Пишем свой парсер pack('c', b'a') pack('5 s', b'hello') pack('6 p', b'hello') b'a' b'hello' b'x 05 hello'
Пишем свой парсер pack('hhl', 1, 2, 3) b'x 01x 00x 02x 00x 03x 00x 00'
Пишем свой парсер pack('hhl', 1, 2, 3) b'x 01x 00x 02x 00x 03x 00x 00' pack('2 h', 1, 2) b'x 01x 00x 02x 00'
Пишем свой парсер pack('hhl', 1, 2, 3) b'x 01x 00x 02x 00x 03x 00x 00' pack('2 h', 1, 2) b'x 01x 00x 02x 00' pack('%dh' % len(a), *a) b'x 01x 00x 02x 00x 10x 00'
Пишем свой парсер unpack('hhl', b'x 01x 00x 02x 00x 03x 00x 00') (1, 2, 3)
Пишем свой парсер unpack('hhl', b'x 01x 00x 02x 00x 03x 00x 00') (1, 2, 3) calcsize('hhl') 8
Пишем свой парсер unpack('hhl', b'x 01x 00x 02x 00x 03x 00x 00') (1, 2, 3) calcsize('hhl') 8 pack('h 0 l', 1) 'x 01x 00x 00'
Прячем файл
Прячем файл GIF 47 49 46 38 39 61 03 00 05 00 … 3 B GIF 89 a Ширина Высота Конец
Прячем файл ZIP chunk 50 4 B xx yy … PK. . Данные