将字节字符串返回到 ExternalInterface.call 会引发错误
Posted
技术标签:
【中文标题】将字节字符串返回到 ExternalInterface.call 会引发错误【英文标题】:Returning a byte string to ExternalInterface.call throws an error 【发布时间】:2011-01-07 14:41:16 【问题描述】:我正在开发我的开源项目Downloadify,到目前为止,它只是处理返回字符串以响应ExternalInterface.call
命令。
我正在尝试使用JSZip 和Downloadify 组合一个测试用例,最终结果是在浏览器中动态创建一个Zip 文件,然后使用FileReference.save
保存到磁盘。但是,这是我的问题:
JSZip 库可以返回 Zip 的 base64
编码字符串或原始字节字符串。问题是,如果我返回该字节字符串以响应 ExternalInterface.call
命令,我会收到此错误:
Error #1085: The element type "string" must be terminated by the matching end-tag "</string>"
动作脚本 3:
var theData:* = ExternalInterface.call('Downloadify.getTextForSave',queue_name);
其中queue_name
只是一个字符串,用于在 JS 中识别正确的实例。
JavaScript:
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 程序员,所以如果你需要更多细节,请告诉我。
【问题讨论】:
看起来不错!我不知道如何回答你的问题,但我想我会在 downloadify.info 上指出一个错字——“是时候广泛使用这个功能了”应该是“是时候广泛使用这个功能了”。 @Dominic Rodger 谢谢伙计......它已修复!计算机语言,我很擅长。人类语言,嗯,那是不同的:) np - 总是很高兴成为一个书呆子! 【参考方案1】:我认为问题是由以下事实引起的,即 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;
您可以简单地缩短函数名称并拍摄更小的图像...或在一个图像上使用ColorTransform
或ConvolutionFilter
而不是四个...或将图像编译为 SWF 以获得更小的整体尺寸...或减少函数名长度...
因此,除非您打算处理 MB 的数据,否则这是可行的方法...
【讨论】:
哎呀...忘了实际发布答案...好吧,无论如何,它可能会有所帮助... ;) 你是对的,即使添加了上面提到的编码/解码器库@Robert,我完成的 SWF 也只添加了 1K。我想我可以忍受。感谢您的宝贵时间!【参考方案2】:当从 javascript 调用返回数据时,它会被序列化为 XML 字符串。因此,如果 JSZip 返回的“原始字符串”将包含使 XML 无效的字符,这就是我认为这里发生的情况,你会得到类似的错误。
实际上你得到的回报是:
<string>[your JSZip generated string]</string>
假设您的返回字符串包含一个“
您可以在 LiveDocs 上阅读有关外部 API 的 XML 格式的更多信息
【讨论】:
+1 但是他将如何解决它?迭代字节流以将0x3C
(0x26 0x6C 0x74 0x3B (<) 等等,然后在 javascript 中返回 Flash?这行得通/实用吗?
我只会使用 base64 编码的字符串,因为库支持,这是一种将数据编码为字符串的好、安全的方法。 github.com/spjwebster/as3base64 有一个支持对 base64 数据进行解码和编码的 AS3 库。
现在开始明白为什么它会抛出似乎是 XML 错误的东西。我现在确实可以使用 base64,我只是希望避免这一步。我想它也一样,因为这就是我最终从 html5 Canvas 元素获取数据的方式。非常感谢您的帮助和出色的回答 +1。以上是关于将字节字符串返回到 ExternalInterface.call 会引发错误的主要内容,如果未能解决你的问题,请参考以下文章
将 .csv 文件从 URL 读取到 Python 3.x - _csv.Error:迭代器应返回字符串,而不是字节(您是不是以文本模式打开文件?)