Чтение данных из файла SharedObject напрямую - PullRequest
0 голосов
/ 27 октября 2018

Я пытаюсь прочитать данные напрямую из файла SharedObject (.sol) в as3.Мне удалось извлечь информацию из заголовка:

// HEADER BYTES
var header1:int = stream.readShort();

// LENGTH
var length:int = header1 & 0x3f;
if (length == 0x3f)
    length = stream.readInt();


// FILETYPE - should be "TCSO"
var sig:String = stream.readUTFBytes( 4 );

// PAD: Unused, 6 bytes long 0x00 0x04 0x00 0x00 0x00 0x00 0x00
var pad:ByteArray = new ByteArray();
stream.readBytes( pad, 0, 6 );

// NAME
//   2 byte short length
var nameLength:int = stream.readUnsignedShort();
var name:String = stream.readUTFBytes( nameLength );

var amfVersion:int = stream.readInt();

Но у меня возникают проблемы при интерпретации следующих данных:

var data:ByteArray = new ByteArray();
stream.readBytes( data );

Я полагал, что они были сохранены как AMFданные и, следовательно, функция ByteArray.readObject должна правильно их декодировать:

var sharedObjectData:Object = data.readObject();

Однако это не удается для всех моих тестовых объектов с ошибкой диапазона.

Кто-нибудь знает формат данныхв SharedObject или как его декодировать?


ПРИЧИНА: Я делаю это, потому что у нас развернуто приложение, и мы случайно изменили имя swf, который сделал SharedObject недоступным с помощью класса SharedObject.

т.е.SharedObject в app_new.swf не может прочитать #SharedObjects/app.swf/objectname.sol

Поэтому необходимо проанализировать файл sol SharedObject, используя прямой доступ к файлу.

1 Ответ

0 голосов
/ 27 октября 2018

Я не использую sharedObjects (они никогда не нужны), поэтому я могу давать советы только о байтах.Каждый раз, когда вы получаете ошибку «вне диапазона / границ», ее можно исправить, проверив и исправив байтовый массив .position.

В вашем случае укажите первую позицию трассы и длину data, чтобы убедиться, что впереди достаточно данных (из текущей позиции) для считывания Object из оставшихся байтов.

Другие варианты решения «Вне диапазона» ошибка: (используйте .writeBytes вместо .readBytes)

var data:ByteArray = new ByteArray();

//or replace "stream.position" with offset value where you think "Object" data begins
data.writeBytes( stream, stream.position, stream.bytesAvailable );

data.position = 0; //reset before reading
var sharedObjectData:Object = data.readObject();

Также посмотрите на Inflate и Uncompress только данные должны быть расширены перед использованием.

...