AS3代码中的文件(作为字节串)

时间:2010-03-10 15:48:19

标签: actionscript-3 file bytearray parseint

我需要直接在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

接下来我在Hex编辑器(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)”进行解析会产生完全相同的结果。

对于一些其他背景,目标文件是KMZ 3D模型,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 :(得分:0)

为什么不将数据存储为字节数组而不是字符串。这将更紧凑(每个字节一个字节,而不是字符串所需的倍数),并且您不必解析回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 //, ...
]);

答案 1 :(得分:0)

使用[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;