<?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; flash</title>
	<atom:link href="http://blog.xnux.net/tag/flash/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>
		<item>
		<title>有用的formatString,支持Actionscript1.0</title>
		<link>http://blog.xnux.net/2008/01/25/actionscript_formatstring/</link>
		<comments>http://blog.xnux.net/2008/01/25/actionscript_formatstring/#comments</comments>
		<pubDate>Thu, 24 Jan 2008 16:28:28 +0000</pubDate>
		<dc:creator>Jack.f</dc:creator>
				<category><![CDATA[开发]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[formatString]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[printf]]></category>
		<category><![CDATA[string.Format]]></category>

		<guid isPermaLink="false">http://blog.xnux.net/2008/01/25/%e6%9c%89%e7%94%a8%e7%9a%84formatstring%e6%94%af%e6%8c%81actionscript10/</guid>
		<description><![CDATA[有用过C#, C/C++, PHP的人都应该知道string.Format或者printf吧! 下面我们让AS也有这样的功能. 什么? 没听说过 ... 拖出去TJJ ...
&#160;
var formatString = function&#40;m&#41;
&#123;
  if &#40;m.indexOf&#40;&#34;{&#34;&#41;==-1&#41; return m;
  var r=&#34;&#34;,n=&#34;&#34;;
  for&#40;var i=0;i&#60;m.length;i++&#41;
  &#123;
    if &#40;m.charAt&#40;i&#41;==&#34;{&#34;&#41;
    &#123;
      i++;
      for&#40;n=&#34;&#34;;m.charAt&#40;i&#41;!=&#34;}&#34;;i++&#41;
        n+=m.charAt&#40;i&#41;;
   [...]]]></description>
			<content:encoded><![CDATA[<p>有用过C#, C/C++, PHP的人都应该知道string.Format或者printf吧! 下面我们让AS也有这样的功能. 什么? 没听说过 ... 拖出去TJJ ...</p>
<pre class="actionscript">&nbsp;
<span style="color: #000000; font-weight: bold;">var</span> formatString = <span style="color: #000000; font-weight: bold;">function</span><span style="color: #66cc66;">&#40;</span>m<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
  <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>m.<span style="color: #0066CC;">indexOf</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;{&quot;</span><span style="color: #66cc66;">&#41;</span>==<span style="color: #cc66cc;">-1</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">return</span> m;
  <span style="color: #000000; font-weight: bold;">var</span> r=<span style="color: #ff0000;">&quot;&quot;</span>,n=<span style="color: #ff0000;">&quot;&quot;</span>;
  <span style="color: #b1b100;">for</span><span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">var</span> i=<span style="color: #cc66cc;">0</span>;i&lt;m.<span style="color: #0066CC;">length</span>;i++<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#123;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>m.<span style="color: #0066CC;">charAt</span><span style="color: #66cc66;">&#40;</span>i<span style="color: #66cc66;">&#41;</span>==<span style="color: #ff0000;">&quot;{&quot;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#123;</span>
      i++;
      <span style="color: #b1b100;">for</span><span style="color: #66cc66;">&#40;</span>n=<span style="color: #ff0000;">&quot;&quot;</span>;m.<span style="color: #0066CC;">charAt</span><span style="color: #66cc66;">&#40;</span>i<span style="color: #66cc66;">&#41;</span>!=<span style="color: #ff0000;">&quot;}&quot;</span>;i++<span style="color: #66cc66;">&#41;</span>
        n+=m.<span style="color: #0066CC;">charAt</span><span style="color: #66cc66;">&#40;</span>i<span style="color: #66cc66;">&#41;</span>;
      <span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">isNaN</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">parseInt</span><span style="color: #66cc66;">&#40;</span>n<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#123;</span>
        r+=<span style="color: #ff0000;">&quot;{&quot;</span>;
        i-=n.<span style="color: #006600;">length</span><span style="color: #cc66cc;">+1</span>;
        <span style="color: #b1b100;">continue</span>;
      <span style="color: #66cc66;">&#125;</span>
      i++;
      r+=<span style="color: #0066CC;">arguments</span><span style="color: #66cc66;">&#91;</span><span style="color: #0066CC;">parseInt</span><span style="color: #66cc66;">&#40;</span>n<span style="color: #66cc66;">&#41;</span><span style="color: #cc66cc;">+1</span><span style="color: #66cc66;">&#93;</span>;
    <span style="color: #66cc66;">&#125;</span>
    r += m.<span style="color: #0066CC;">charAt</span><span style="color: #66cc66;">&#40;</span>i<span style="color: #66cc66;">&#41;</span>;
  <span style="color: #66cc66;">&#125;</span>
  <span style="color: #b1b100;">return</span> r;
<span style="color: #66cc66;">&#125;</span>;
&nbsp;
<span style="color: #808080; font-style: italic;">/* usage:
var model = &quot;&lt;font size='{2}'&gt;&lt;b&gt;{0}&lt;/b&gt;+&lt;b&gt;{1}&lt;/b&gt;=&lt;b&gt;{0}&lt;/b&gt;&lt;/font&gt;&quot;;
var str = formatString(model, 100, 0, 9);
trace(str);
// output: &lt;font size='9'&gt;&lt;b&gt;100&lt;/b&gt;+&lt;b&gt;0&lt;/b&gt;=&lt;b&gt;100&lt;/b&gt;&lt;/font&gt;
*/</span> 就这么简单, 如果觉得不爽, 你可以继续使用:
<span style="color: #000000; font-weight: bold;">var</span> str = <span style="color: #ff0000;">&quot;&lt;font size='&quot;</span><span style="color: #cc66cc;">+9</span>+<span style="color: #ff0000;">&quot;'&gt;&lt;b&gt;&quot;</span><span style="color: #cc66cc;">+100</span>+<span style="color: #ff0000;">&quot;&lt;/b&gt;+&lt;b&gt;&quot;</span><span style="color: #cc66cc;">+0</span>+<span style="color: #ff0000;">&quot;&lt;/b&gt;=&lt;b&gt;&quot;</span><span style="color: #cc66cc;">+100</span>+<span style="color: #ff0000;">&quot;&lt;/b&gt;&lt;/font&gt;&quot;</span>;
<span style="color: #0066CC;">trace</span><span style="color: #66cc66;">&#40;</span>... 狂呕中 ...
&nbsp;</pre>
<p><strong>顺便说一句: </strong>函数体不用修改, 直接拿到html里当Javascript使, 也可以</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xnux.net/2008/01/25/actionscript_formatstring/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>瘦版的Delegate,支持Actionscript1.0</title>
		<link>http://blog.xnux.net/2008/01/24/actionscript_delegate/</link>
		<comments>http://blog.xnux.net/2008/01/24/actionscript_delegate/#comments</comments>
		<pubDate>Thu, 24 Jan 2008 15:33:28 +0000</pubDate>
		<dc:creator>Jack.f</dc:creator>
				<category><![CDATA[开发]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[delegate]]></category>
		<category><![CDATA[Delegate.create]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[mx.utils.Delegate]]></category>

		<guid isPermaLink="false">http://blog.xnux.net/2008/01/24/actionscript_delegate/</guid>
		<description><![CDATA[ Actionscript 2.0 内置了mx.utils.Delegate的类, 用法就不说了, 自己查查Google, 写了个瘦版的, 经测试可以支持Actionscript 1.0 ...
&#160;
var fns = &#91;&#93;;
var delegate = function&#40;o, f&#41;
&#123;
    var i = fns.length;
    var fn = function&#40;&#41;&#123; fns&#91;i&#93;.f.apply&#40;fns&#91;i&#93;.o, &#91;arguments,this&#93;&#41;; &#125;;
    fns&#91;i&#93; = &#123;o:o, f:f&#125;;
    return fn;
&#125;
&#160;
/* usage:
var onStart = function()
{
    trace(this);
};
&#160;
btn_start.onRelease = delegate(this, onStart); [...]]]></description>
			<content:encoded><![CDATA[<p> Actionscript 2.0 内置了mx.utils.Delegate的类, 用法就不说了, 自己查查Google, 写了个瘦版的, 经测试可以支持Actionscript 1.0 ...</p>
<pre class="actionscript">&nbsp;
<span style="color: #000000; font-weight: bold;">var</span> fns = <span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#93;</span>;
<span style="color: #000000; font-weight: bold;">var</span> delegate = <span style="color: #000000; font-weight: bold;">function</span><span style="color: #66cc66;">&#40;</span>o, f<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">var</span> i = fns.<span style="color: #0066CC;">length</span>;
    <span style="color: #000000; font-weight: bold;">var</span> fn = <span style="color: #000000; font-weight: bold;">function</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#123;</span> fns<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span>.<span style="color: #006600;">f</span>.<span style="color: #0066CC;">apply</span><span style="color: #66cc66;">&#40;</span>fns<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span>.<span style="color: #006600;">o</span>, <span style="color: #66cc66;">&#91;</span><span style="color: #0066CC;">arguments</span>,<span style="color: #0066CC;">this</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>; <span style="color: #66cc66;">&#125;</span>;
    fns<span style="color: #66cc66;">&#91;</span>i<span style="color: #66cc66;">&#93;</span> = <span style="color: #66cc66;">&#123;</span>o:o, f:f<span style="color: #66cc66;">&#125;</span>;
    <span style="color: #b1b100;">return</span> fn;
<span style="color: #66cc66;">&#125;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">/* usage:
var onStart = function()
{
    trace(this);
};
&nbsp;
btn_start.onRelease = delegate(this, onStart); // output: _level0
//btn_start.onRelease = onStart; // output: _level0.btn_start
*/</span>
&nbsp;</pre>
<p>为什么说是廋版的呢, 其实就是编译后的文件小了一些, 看数据:</p>
<p>使用 mx.utils.Delegate, 文件大小会增加<strong>841 byte</strong>, 使用上面的代码, 文件大小只增加<strong>379 byte</strong>, 瘦了<strong>462 byte</strong>, 相当于小了一半多, 如果算上调用语法所占的大小, 应该不只少<strong>462 byte</strong>.虽然按字节数来说, 瘦得不多, 可是大家都知道积少成多的道理, 环保呀 ...</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.xnux.net/2008/01/24/actionscript_delegate/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
