Каталог статей
Главная » Статьи » S3DecoderLib |
S3DecoderLib: Приложение 6. Чтение 7BITSTR
|
Приложение 6: Чтение 7BITSTR [ Стабильный билд • 7BITSTR (eng) • MSDN: BinaryWriter.Write • Вспомогательные типы данных и функции ]
Програмный модуль и версия DBPF2Utils.pas, rev.120825
Краткий обзор
7BITSTR – один из форматов строк используемых в The Sims 1 – 3. Строка представляет собой массив символов UnicodeBE, предваренных количеством символов. Длина строки кодируется одним или более байтами со значащими 7 битами, старший бит выступает как маркер конца размера строки. Формат является "родным" для платформы .NET и реализуется методами WriteString, ReadString классов BinaryWriter/Reader
Описание алгоритма
Для декодирования длины 7бит кодированной строки, используется следующая логика: 1. Задаем длину как 0; 2. Читаем байт и складываем его 7 младших бит сдвинутые на 7*номер_байта влево с длиной; 3. Если старший байт не равен 1, повторяем шаги 2 и 3; 4. Читаем символы пословно, меняя порядок байтов в слове; Реализация на Pascal function Read7BitStr(AStream: TStream): string; // читает строку .NET с текущей позиции потока // http://www.modthesims.info/wiki.php?title=7BITSTR // http://msdn.microsoft.com/ru-ru/library/yzxa6408.aspx var len, i: integer; b: BYTE; c: char; begin len:= 0; i:= 0; result:= ''; repeat AStream.ReadBuffer(b, 1); len:= len or ((b and $7F) shl (7*i)); inc(i); until (b and $80)=0; len:= len div 2; // количество символов = кол-во байт / 2 for i:= 1 to len do begin AStream.ReadBuffer((PByte(@c)+1)^, 1); // UnicodeBE -> UTF-16 (LE) AStream.ReadBuffer((PByte(@c)+0)^, 1); result:= result+c; end; end; | |
Категория: S3DecoderLib | Добавил: crazylab (28.09.2013) | |
Просмотров: 750 |