<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>撒旦 &#187; as3</title>
	<atom:link href="http://blog.xnux.net/tag/as3/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.xnux.net</link>
	<description>still life ...</description>
	<lastBuildDate>Wed, 06 Jan 2010 18:34:30 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Flash毒药收集</title>
		<link>http://blog.xnux.net/2009/04/01/flash_poisons/</link>
		<comments>http://blog.xnux.net/2009/04/01/flash_poisons/#comments</comments>
		<pubDate>Wed, 01 Apr 2009 03:06:47 +0000</pubDate>
		<dc:creator>Jack.f</dc:creator>
				<category><![CDATA[开发]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[破坏]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[crash]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[flash cs]]></category>
		<category><![CDATA[flashplayer]]></category>
		<category><![CDATA[Matrix3D]]></category>

		<guid isPermaLink="false">http://blog.xnux.net/?p=67</guid>
		<description><![CDATA[第一剂:
new Matrix3D().append(null);
杀伤力: 4星
辐射面: flash cs4, flashplayer 10.*, as3
症状: flash cs4 意外退出，flashplayer 10.*直接crash
来源: D.S
第二剂:
var a=&#60;a&#62;&#60;n/&#62;&#60;/a&#62;
a.@* = a.@*;
a.toString();
杀伤力: 5星
辐射面: flash cs3/4, flashplayer 9/10, as3
症状: flash cs3, 4 crash，flashplayer9以上播放swf时直接crash
来源: Ticore's Blog
第三剂:
Object['isPrototypeOf']();
Object['hasOwnPrototype']();
Object['propertyIsEnumerable']();
Object['setPropertyIsEnumerable']();
//(以上任意一行)
杀伤力: 5星
辐射面: flash cs3/4, flashplayer 9/10, as3
症状: flash cs3, 4 crash，flashplayer9以上播放swf时直接crash
来源: Ticore's Blog
]]></description>
			<content:encoded><![CDATA[<p><strong>第一剂:</strong></p>
<p>new Matrix3D().append(null);</p>
<p>杀伤力: 4星<br />
辐射面: flash cs4, flashplayer 10.*, as3<br />
症状: flash cs4 意外退出，flashplayer 10.*直接crash<br />
来源: D.S</p>
<p><strong>第二剂:</strong></p>
<p>var a=&lt;a&gt;&lt;n/&gt;&lt;/a&gt;<br />
a.@* = a.@*;<br />
a.toString();</p>
<p>杀伤力: 5星<br />
辐射面: flash cs3/4, flashplayer 9/10, as3<br />
症状: flash cs3, 4 crash，flashplayer9以上播放swf时直接crash<br />
来源: <a href="http://ticore.blogspot.com/">Ticore's Blog</a></p>
<p><strong>第三剂:</strong></p>
<p>Object['isPrototypeOf']();<br />
Object['hasOwnPrototype']();<br />
Object['propertyIsEnumerable']();<br />
Object['setPropertyIsEnumerable']();</p>
<p>//(以上任意一行)</p>
<p>杀伤力: 5星<br />
辐射面: flash cs3/4, flashplayer 9/10, as3<br />
症状: flash cs3, 4 crash，flashplayer9以上播放swf时直接crash<br />
来源: <a href="http://ticore.blogspot.com/">Ticore's Blog</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xnux.net/2009/04/01/flash_poisons/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AS3处理GB2312数据的严重BUG</title>
		<link>http://blog.xnux.net/2009/01/20/as3_gb2312_bug/</link>
		<comments>http://blog.xnux.net/2009/01/20/as3_gb2312_bug/#comments</comments>
		<pubDate>Tue, 20 Jan 2009 07:47:43 +0000</pubDate>
		<dc:creator>Jack.f</dc:creator>
				<category><![CDATA[技术]]></category>
		<category><![CDATA[#1085]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[Error #1085]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[xml]]></category>

		<guid isPermaLink="false">http://blog.xnux.net/?p=22</guid>
		<description><![CDATA[BUG描述:
flash as3使用URLLoader &#38; URLRequest加载gb2312文本时，字符串内存边界判断有误，导致读出的数据结尾有随机乱码或者数据读取不完整。
捉虫全记录:
&#62; 使用as3加载解析XML时，发现偶尔会抛出XML格式错误的异常，运气不好的话出现频率非常之高;
&#62; 用trace显示数据内容时，发现文件有时加载不全、有时尾部有随机乱码;
&#62; 使用抓包软件发现数据完全正常，所以肯定是flash搞的鬼;
&#62; 开始怀疑文本编码导致的问题，将文件存为utf-8后，完全没问题;
&#62; 试了多次，随机内容有时完全是无关的东东，偶尔还有其它进程里的一些数据;
&#62; 到此为止，可以肯定是内存字符串结束符处理问题;
影响面:
flashplayer 9, 10
解决方案:
方案一: 尽量不要使用gb2312数据源，如果非用不可，可参考《方案二》;
方案二: 建立socket连接，自已发送http header，接收数据进行解析，如果遇到跨域问题则看《方案三》;
方案三: 在数据尾部加入特殊的结束符(比如:)，数据加载完成后把结束符后的内容全部去掉，如果遇到加载不完整的情况，则重试加载(记得要限制次数)，不能100%保证，经过测试重试后成功率99.9%;
附件:
BUG演示程序
 
根据allen的处理方法，进一步追查了原因，可以确切的定位出是ByteArray.toString方法的BUG所致:
&#62; URLLoader.data 是 ByteArray 类型，所以只要把 e.target.data as String 改为 e.target.data.readMultiByte(e.target.data.length, "gb2312") 即可以解决问题;
&#62; e.target.data as String 实际上是执行了 ByteArray 的 toString 方法，那么很可能BUG是出在 ByteArray.toString 方法;
&#62; ByteArray相当于是向量数组，length值应该是根据写入数据长度来改变，所以length值无论如何都是正确的，所以按上面 readMultiByte 方法读取，不会读出多余的数据，而 ByteArray.toString 方法并不能使用属性length来获取数据长度，需要根据编码类型来动态计算，正常来说是不会有错的，错就错在处理部分编码类型时使用了strlen或sizeof去获取数据长度，而ByteArray是可以存任何二进制数据的，当然不会有\0结束，这样的情形下strlen和sizeof是绝对不可信赖的;
&#62; 只有这样才能解释 toString 的BUG。
 
结论是:
不要尝试使用 ByteArray.toString 的方法来获取 gb 编码的数据，最好是根据目标编码，使用 readMultiByte 读取。
]]></description>
			<content:encoded><![CDATA[<p><strong>BUG描述:</strong></p>
<p>flash as3使用URLLoader &amp; URLRequest加载gb2312文本时，字符串内存边界判断有误，导致读出的数据结尾有随机乱码或者数据读取不完整。</p>
<p><strong>捉虫全记录:</strong></p>
<p>&gt; 使用as3加载解析XML时，发现偶尔会抛出XML格式错误的异常，运气不好的话出现频率非常之高;</p>
<p>&gt; 用trace显示数据内容时，发现文件有时加载不全、有时尾部有随机乱码;</p>
<p>&gt; 使用抓包软件发现数据完全正常，所以肯定是flash搞的鬼;</p>
<p>&gt; 开始怀疑文本编码导致的问题，将文件存为utf-8后，完全没问题;</p>
<p>&gt; 试了多次，随机内容有时完全是无关的东东，偶尔还有其它进程里的一些数据;</p>
<p>&gt; 到此为止，可以肯定是内存字符串结束符处理问题;</p>
<p><strong>影响面:</strong></p>
<p>flashplayer 9, 10</p>
<p><strong>解决方案:</strong></p>
<p><em>方案一: </em>尽量不要使用gb2312数据源，如果非用不可，可参考《方案二》;</p>
<p><em>方案二: </em>建立socket连接，自已发送http header，接收数据进行解析，如果遇到跨域问题则看《方案三》;</p>
<p><em>方案三: </em>在数据尾部加入特殊的结束符(比如:<!--end-->)，数据加载完成后把结束符后的内容全部去掉，如果遇到加载不完整的情况，则重试加载(记得要限制次数)，不能100%保证，经过测试重试后成功率99.9%;</p>
<p><strong>附件:</strong></p>
<p><a href="http://xnux.net/demo/flash_bug_gb2312.zip">BUG演示程序</a></p>
<p> </p>
<p>根据<a href="http://www.cbmland.com/">allen</a>的处理方法，进一步追查了原因，可以确切的定位出是ByteArray.toString方法的BUG所致:</p>
<p>&gt; URLLoader.data 是 ByteArray 类型，所以只要把 e.target.data as String 改为 e.target.data.readMultiByte(e.target.data.length, "gb2312") 即可以解决问题;</p>
<p>&gt; e.target.data as String 实际上是执行了 ByteArray 的 toString 方法，那么很可能BUG是出在 ByteArray.toString 方法;</p>
<p>&gt; ByteArray相当于是向量数组，length值应该是根据写入数据长度来改变，所以length值无论如何都是正确的，所以按上面 readMultiByte 方法读取，不会读出多余的数据，而 ByteArray.toString 方法并不能使用属性length来获取数据长度，需要根据编码类型来动态计算，正常来说是不会有错的，错就错在处理部分编码类型时使用了strlen或sizeof去获取数据长度，而ByteArray是可以存任何二进制数据的，当然不会有\0结束，这样的情形下strlen和sizeof是绝对不可信赖的;</p>
<p>&gt; 只有这样才能解释 toString 的BUG。<br />
 <br />
<strong>结论是:</strong><br />
不要尝试使用 ByteArray.toString 的方法来获取 gb 编码的数据，最好是根据目标编码，使用 readMultiByte 读取。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xnux.net/2009/01/20/as3_gb2312_bug/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
