Файл (в виде строки байтов) в коде AS3 - PullRequest
0 голосов
/ 10 марта 2010

Мне нужно «встроить» файл в виде строки байтов непосредственно в код AS3, а не вызывать его как внешний ресурс.

Так что это прекрасно работает:

var testString = "537563636573733a20537472696e672072652d656e636f6465642e";
var testArray:ByteArray = new ByteArray();
var len:uint = testString.length;

trace("testString LENGTH: " + len.toString());

for (var i:uint = 0; i < len; i += 2) {
    var c:String = '0x' + testString.charAt(i) + testString.charAt(i + 1);

    if(i < 10) { trace("testString Byte: " + c); }

    testArray.writeByte(parseInt(c));
}

trace("testString: " + testArray.toString());
trace("testString NUMBER OF BYTES: " + testArray.length.toString());

И выдает это в консоли:

testString LENGTH: 54
testString Byte: 0x53
testString Byte: 0x75
testString Byte: 0x63
testString Byte: 0x63
testString Byte: 0x65
testString: Success: String re-encoded.
testString NUMBER OF BYTES: 27

Итак, затем я открываю целевой файл в шестнадцатеричном редакторе (HxD), копирую и вставляю байты непосредственно в мою переменную String, как и выше, и получаю следующий вывод в консоль:

testString LENGTH: 97478
testString Byte: 0x50
testString Byte: 0x4B
testString Byte: 0x03
testString Byte: 0x04
testString Byte: 0x14
testString: PK```
testString NUMBER OF BYTES: 48739

... и файл (как ByteArray) не читается той же библиотекой, которая отлично читает его, когда использует его как внешний ресурс (используя URLLoader.)

Я попытался скопировать байтовую строку из моего кода, вставить ее в Hex-редактор и сохранить как файл, и файл был заново создан правильно, поэтому я не думаю, что это проблема копирования и вставки. Кроме того, удаление «0x» с начала каждой строки байтов и анализ с помощью «parseInt (c, 16)» приводит к точно таким же результатам.

Для некоторого дополнительного фона целевой файл представляет собой 3D-модель KMZ, и этот файл анализируется библиотекой Papervision3D KMZ.as, которая использует библиотеку Nochump для распаковки KMZ-файла. Сообщение об ошибке, которое я получаю при попытке передать ByteArray в KMZ.as:

Error: invalid zip
    at nochump.util.zip::ZipFile/findEND()
    at nochump.util.zip::ZipFile/readEND()
    at nochump.util.zip::ZipFile/readEntries()
    at nochump.util.zip::ZipFile()
    at org.papervision3d.objects.parsers::KMZ/parse()
    at org.papervision3d.objects.parsers::KMZ/load()
    at infoModel/initKMZ2()
    at infoModel()

Любые мысли и / или предложения будут с благодарностью.

фураж

Ответы [ 2 ]

0 голосов
/ 11 марта 2010

Используйте тег [Embed()].

// Put this as a member variable in one of your classes somewhere
[Embed(source="object.kmz", mimeType="application/octet-stream")]
private static var myKMZ :Class;

Теперь myKMZ будет классом, расширяющим ByteArray.

Как получить данные:

var myKMZbytes :ByteArray = new myKMZ() as ByteArray;
0 голосов
/ 10 марта 2010

Почему бы просто не хранить данные в виде массива байтов вместо строки. Это будет намного более компактно (один байт на байт, вместо кратного, необходимого для строки), и вам не придется анализировать обратно в int.

function toByteArray(a:Array):ByteArray {
  var bytes:ByteArray = new ByteArray();
  for each(var b:int in a) {
    bytes.writeByte(b);
  }
  return bytes;
}

var testData:ByteArray = toByteArray([
  0x53, 0x75, 0x63, 0x63, 0x65, 0x73,
  0x73, 0x3a, 0x20, 0x53, 0x74, 0x72,
  0x69, 0x6e, 0x67, 0x20, 0x72, 0x65,
  0x2d, 0x65, 0x6e, 0x63, 0x6f, 0x64,
  0x65, 0x64, 0x2e //, ...
]);
...