Суббота, 23.11.2024, 12:39
Приветствую Вас Гость

Каталог статей

Главная » Статьи » 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