Javascript 将字节字符串返回ExternalInterface.call会引发错误

Javascript 将字节字符串返回ExternalInterface.call会引发错误,javascript,flash,actionscript-3,bytearray,externalinterface,Javascript,Flash,Actionscript 3,Bytearray,Externalinterface,我正在做我的开源项目,到目前为止,它只处理返回字符串以响应ExternalInterface.call命令 我试图使用和Downloadify组合一个测试用例,最终结果是在浏览器中动态创建一个Zip文件,然后使用FileReference.save将其保存到磁盘。然而,这是我的问题: JSZip库可以返回Zip的base64编码字符串或原始字节字符串。问题是,如果我返回该字节字符串以响应ExternalInterface.call命令,则会出现以下错误: Error #1085: The ele

我正在做我的开源项目,到目前为止,它只处理返回字符串以响应
ExternalInterface.call
命令

我试图使用和Downloadify组合一个测试用例,最终结果是在浏览器中动态创建一个Zip文件,然后使用
FileReference.save
将其保存到磁盘。然而,这是我的问题:

JSZip库可以返回Zip的
base64
编码字符串或原始字节字符串。问题是,如果我返回该字节字符串以响应
ExternalInterface.call
命令,则会出现以下错误:

Error #1085: The element type "string" must be terminated by the matching end-tag "</string>"
其中,
queue\u name
只是一个字符串,用于标识JS中的正确实例

JavaScript:

var theData:* = ExternalInterface.call('Downloadify.getTextForSave',queue_name);
var zip = new JSZip();
zip.add("test.txt", "Hello world!\n");
var content = zip.generate(true);
return content;
如果我返回的是普通字符串而不是字节字符串,则调用工作正常。我希望避免使用
base64
,因为我必须在我的
swf
中包含
base64
解码器,这将增加其大小

最后:我不是在寻找AS3 Zip生成器。我的项目必须在JavaScript中运行该部分


无可否认,我不是AS3程序员,所以如果您需要更多详细信息,请告诉我。

当javascript调用返回数据时,数据将被序列化为XML字符串。因此,如果JSZip返回的“原始字符串”将包含使XML无效的字符,我认为这就是这里发生的情况,您将得到类似的错误

你得到的回报实际上是:

<string>[your JSZip generated string]</string>
[您的JSZip生成的字符串]

假设您的返回字符串包含一个“我认为问题是由以下事实引起的:flash需要一个utf8字符串,而您向它抛出了一些二进制内容。例如,我认为0x00FF将不会被证明是有效的utf8

你可以试着摆弄
flash.system::system.setCodePage
,但我不会太乐观

我想base64解码器可能真的是最简单的…我宁愿担心速度而不是文件大小…这种基本的解码器方法使用不到半个K:

public function decodeBase64(source:String):ByteArray {
 var ret:ByteArray = new ByteArray();
 var map:Object = new Object();
 var i:int = 0;
 for each (var char:String in "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split("")) map[char] = i++;
 map["="] = 0;
 source = source.split("\n").join("").split("\r").join("");//remove linebreaks
 for (i = 0; i < source.length/4; i++) {
  var buf:int = 0;
  for each (char in source.substr(i * 4, 4).split("")) buf = (buf << 6) + map[char];
  ret.writeByte(buf >>> 16);
  ret.writeShort(buf);
 }
 return ret;
}
公共函数decodeBase64(源代码:String):ByteArray{
var-ret:ByteArray=新的ByteArray();
变量映射:对象=新对象();
变量i:int=0;
对于每个(var char:ABCDEFGHIJKLMNOPQRSTUVXYZABDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/”中的字符串。拆分(“”)映射[char]=i++;
映射[“=”]=0;
source=source.split(“\n”).join(“”)。split(“\r”).join(“”;//删除换行符
对于(i=0;i>16);
ret.writeShort(buf);
}
返回ret;
}
您可以简单地缩短函数名并获取较小的图像…或者在一个图像上使用
ColorTransform
卷积过滤器
,而不是四个图像…或者将图像编译到SWF中以获得较小的总体大小…或者减少函数名长度


因此,除非你打算使用MBs数据,否则这是一个好办法……

看起来不错!我不知道如何回答你的问题,但我想我应该指出downloadity.info上的一个错误—“是时候广泛使用此功能了”应该是“是时候广泛使用此功能了”“@Dominic Rodger谢谢你,伙计。。。它是固定的!计算机语言,我很酷。人类语言,嗯,那是不同的:)np-总是很高兴成为一个学究+1但他将如何着手修复它?迭代ByTestStream以替换
0x3C
(我会使用base64编码的字符串,就像库支持的那样,这是一种将数据编码为字符串的好的、安全的方法。有一个AS3库支持对base64数据进行解码和编码。这现在开始有意义了,为什么它抛出了一个似乎是XML错误的东西。我现在确实使用base64了,我只是希望避免d这一步。我想也是这样,因为这就是我最终从HTML5画布元素获取数据的方式。非常感谢您的帮助和您的精彩答案+1。哎呀……忘了发布答案了……不管怎样,这可能会有所帮助……;)你是对的,即使添加上面提到的编码/解码库@Robert,也只为我完成的SWF添加了1K。我想我可以接受。谢谢你的时间!