﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-农妇，山泉，有点儿田-随笔分类-ACE</title><link>http://www.cppblog.com/deadpunk/category/6433.html</link><description>我没有技术</description><language>zh-cn</language><lastBuildDate>Wed, 21 May 2008 18:18:25 GMT</lastBuildDate><pubDate>Wed, 21 May 2008 18:18:25 GMT</pubDate><ttl>60</ttl><item><title>(转载)关于ACE_InputCDR和ACE_OutputCDR读写数据时的经验</title><link>http://www.cppblog.com/deadpunk/archive/2008/03/19/44858.html</link><dc:creator>活着就是折腾，所以当然要骠悍的折腾</dc:creator><author>活着就是折腾，所以当然要骠悍的折腾</author><pubDate>Wed, 19 Mar 2008 07:44:00 GMT</pubDate><guid>http://www.cppblog.com/deadpunk/archive/2008/03/19/44858.html</guid><wfw:comment>http://www.cppblog.com/deadpunk/comments/44858.html</wfw:comment><comments>http://www.cppblog.com/deadpunk/archive/2008/03/19/44858.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/deadpunk/comments/commentRss/44858.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/deadpunk/services/trackbacks/44858.html</trackback:ping><description><![CDATA[<p><font size=3><font face=宋体>我今天测试发现</font><font face=Arial>ACE_InputCDR</font><font face=宋体>和</font><font face=Arial>ACE_OutputCDR</font><font face=宋体>并不是那么简单。</font><font face=Arial><o:p></o:p></font></font></p>
<p><font face=宋体 size=3>如果稍微不注意就会出现一些奇怪的字节错位的情况。</font><font face=Arial><o:p></o:p></font></p>
<p><font face=Arial size=3><o:p></o:p></font></p>
<p><font face=宋体 size=3>在这里我总结一下使用的规则：</font><font face=Arial><o:p></o:p></font></p>
<p><font face=Arial size=3><o:p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACE_OutputCDR out(mb);</o:p></font></p>
<p><font face=Arial size=3><o:p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out&nbsp;&nbsp;&lt;&lt; ?? ;&nbsp;&nbsp;&nbsp;&nbsp; //这种方法简称out</o:p></font></p>
<p><font size=3><font face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font face=宋体>例一：</font><font face=Arial><o:p></o:p></font></font></p>
<p><font size=3><font face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font face=宋体>如果</font><font face=Arial>out </font><font face=宋体>了一个</font><font face=Arial>short</font><font face=宋体>再</font><font face=Arial>out</font><font face=宋体>一个</font><font face=Arial>long </font></font></p>
<p><font size=3><font face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font face=宋体>字节将成为如下排列</font><font face=Arial>(16</font><font face=宋体>进制</font><font face=Arial>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xx xx ?? ?? xx xx xx xx<o:p></o:p></font></font></p>
<p><font size=3><font face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font face=宋体>其中，问号部分即是因为在</font><font face=Arial>long</font><font face=宋体>写入时进行的按</font><font face=Arial>long</font><font face=宋体>长度对齐。该数据是无意义的</font><font face=Arial><o:p></o:p></font></font></p>
<p><font face=Arial><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <o:p></o:p></font></font></p>
<p><font size=3><font face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font face=宋体>例二：</font><font face=Arial><o:p></o:p></font></font></p>
<p><font size=3><font face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font face=宋体>如果</font><font face=Arial>out</font><font face=宋体>了一个</font><font face=Arial>char</font><font face=宋体>再</font><font face=Arial>out</font><font face=宋体>一个</font><font face=Arial> short<o:p></o:p></font></font></p>
<p><font size=3><font face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font face=宋体>字节将成为如下排列</font><font face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xx&nbsp;&nbsp;??&nbsp;&nbsp;xx xx<o:p></o:p></font></font></p>
<p><font size=3><font face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font face=宋体>其中，问号部分即是因为在</font><font face=Arial>short</font><font face=宋体>写入时进行的按</font><font face=Arial>short</font><font face=宋体>长度对齐。该数据是无意义的</font><font face=Arial><o:p></o:p></font></font></p>
<p><font face=Arial><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <o:p></o:p></font></font></p>
<p><font face=Arial><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <o:p></o:p></font></font></p>
<p><font size=3><font face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font face=宋体>例三：</font><font face=Arial><o:p></o:p></font></font></p>
<p><font size=3><font face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font face=宋体>如果</font><font face=Arial>out</font><font face=宋体>了一个</font><font face=Arial>short</font><font face=宋体>再</font><font face=Arial>out</font><font face=宋体>一个</font><font face=Arial>char<o:p></o:p></font></font></p>
<p><font size=3><font face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font face=宋体>字节将成为如下排列</font><font face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xx&nbsp;&nbsp;xx&nbsp;&nbsp;&nbsp;&nbsp;xx <o:p></o:p></font></font></p>
<p><font size=3><font face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font face=宋体>这里输入的</font><font face=Arial>char</font><font face=宋体>不会造成对齐问题，因为</font><font face=Arial>char</font><font face=宋体>只有一个字节（都是倍数）</font><font face=Arial><o:p></o:p></font></font></p>
<p><font face=Arial><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <o:p></o:p></font></font></p>
<p><font size=3><font face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font face=宋体>例四：</font><font face=Arial><o:p></o:p></font></font></p>
<p><font size=3><font face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font face=宋体>如果</font><font face=Arial>out</font><font face=宋体>了一个</font><font face=Arial>short</font><font face=宋体>再</font><font face=Arial>out</font><font face=宋体>一个</font><font face=Arial>char </font><font face=宋体>再</font><font face=Arial>out </font><font face=宋体>一个</font><font face=Arial> long<o:p></o:p></font></font></p>
<p><font size=3><font face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font face=宋体>字节将成为如下排列</font><font face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xx&nbsp;&nbsp;xx&nbsp;&nbsp;xx&nbsp;&nbsp;??&nbsp;&nbsp;xx&nbsp;&nbsp;xx&nbsp;&nbsp;xx&nbsp;&nbsp;xx<o:p></o:p></font></font></p>
<p><font face=Arial><font size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <o:p></o:p></font></font></p>
<p><font size=3><font face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font face=宋体>按照以上可总结出，每</font><font face=Arial>out</font><font face=宋体>一个类型的数据时，输出流将自动按照这个输入类型的长度序对齐，如果没有对齐，则自动填充。</font></font></p>
<p><font face=宋体 size=3>&nbsp;&nbsp;&nbsp;&nbsp; 导致读数据时产生非常多的问题。（你不见CNPV1中都是强转成ACE_CDR::ULong吗？这下知道了吧）。</font></p>
<p><font face=宋体 size=3>解决方案有两种：</font></p>
<p><font face=宋体 size=3>方案一：全部一种类型吧！比如全部用ACE_CDR::ULong</font></p>
<p><font face=宋体 size=3>&nbsp;&nbsp;&nbsp;&nbsp;不过这种方法通常不适合实际的应用。让偶动物园墙垮来帮大家解决这个心结。:) 西西，请看下一方案。</font></p>
<p><font face=宋体 size=3>方案二：</font></p>
<p><font face=宋体 size=3>大家都会觉得这玩意被做出来怎么就不好用呢？没道理吧。我也觉得没道理，所以为了证实ACE开发者都是大牛，偶就把ACE的代码挖出来给大家看看，</font></p>
<p><font face=宋体 size=3>看看这里到底有着什么样的玄机？</font></p>
<p><font face=宋体 size=3>我们就拿ACE_ULong来开刀：</font></p>
<p><font face=宋体 size=3>大家翻开CDR_Stream.inl文件，找到以下语句</font></p>
<p><font face=宋体 size=3>ACE_INLINE ACE_CDR::Boolean<br>operator&lt;&lt; (ACE_OutputCDR &amp;os, ACE_CDR::ULong x)<br>{<br>&nbsp;&nbsp;os.write_ulong (x);<br>&nbsp;&nbsp;return (ACE_CDR::Boolean) os.good_bit ();<br>}</font></p>
<p><font face=宋体 size=3>继续下去 os.write_ulong (x);<br></font></p>
<p><font face=宋体 size=3>ACE_INLINE ACE_CDR::Boolean<br>ACE_OutputCDR::write_ulong (ACE_CDR::ULong x)<br>{<br>&nbsp;&nbsp;const void *temp = &amp;x;<br>&nbsp;&nbsp;return this-&gt;write_4 (reinterpret_cast&lt;const ACE_CDR::ULong*&gt; (temp));<br>}</font></p>
<p><font face=宋体 size=3>继续跟踪this-&gt;write_4 (reinterpret_cast&lt;const ACE_CDR::ULong*&gt; (temp));</font></p>
<p><font face=宋体 size=3>ACE_CDR::Boolean<br>ACE_OutputCDR::write_4 (const ACE_CDR::ULong *x)<br>{<br>&nbsp;&nbsp;char *buf = 0;<br>&nbsp;&nbsp;if (this-&gt;adjust (ACE_CDR::LONG_SIZE, buf) == 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;{</font></p>
<p><font face=宋体 size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ....</font></p>
<p><font face=宋体 size=3>&nbsp;&nbsp;&nbsp;&nbsp;}</font></p>
<p><font face=宋体 size=3>}</font></p>
<p><font face=宋体 size=3>再继续adjust (ACE_CDR::LONG_SIZE, buf)</font></p>
<p><font face=宋体 size=3>ACE_INLINE int<br>ACE_OutputCDR::adjust (size_t size, char*&amp; buf)<br>{<br>&nbsp;&nbsp;return this-&gt;adjust (size, size, buf);<br>}</font></p>
<p><font face=宋体 size=3>继续 this-&gt;adjust (size, size, buf);</font></p>
<p><font face=宋体 size=3>ACE_INLINE int<br>ACE_OutputCDR::adjust (size_t size,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; size_t align,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char*&amp; buf)<br>{<br>&nbsp;&nbsp;if (!this-&gt;current_is_writable_)<br>&nbsp;&nbsp;&nbsp;&nbsp;return this-&gt;grow_and_adjust (size, align, buf);</font></p>
<p><font face=宋体 size=3>#if !defined (ACE_LACKS_CDR_ALIGNMENT)<br>&nbsp;&nbsp;const size_t offset =<br>&nbsp;&nbsp;&nbsp;&nbsp;ACE_align_binary (this-&gt;current_alignment_, align)<br>&nbsp;&nbsp;&nbsp;&nbsp;- this-&gt;current_alignment_;</font></p>
<p><font face=宋体 size=3>&nbsp;&nbsp;buf = this-&gt;current_-&gt;wr_ptr () + offset;<br>#else<br>&nbsp;&nbsp;buf = this-&gt;current_-&gt;wr_ptr ();<br>#endif /* ACE_LACKS_CDR_ALIGNMENT */</font></p>
<p><font face=宋体 size=3>&nbsp;&nbsp;char *end = buf + size;</font></p>
<p><font face=宋体 size=3>&nbsp;&nbsp;if (end &lt;= this-&gt;current_-&gt;end () &amp;&amp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end &gt;= buf)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>#if !defined (ACE_LACKS_CDR_ALIGNMENT)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;current_alignment_ += offset + size;<br>#endif /* ACE_LACKS_CDR_ALIGNMENT */<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;current_-&gt;wr_ptr (end);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;}</font></p>
<p><font face=宋体 size=3>&nbsp;&nbsp;return this-&gt;grow_and_adjust (size, align, buf);<br>}</font></p>
<p><font face=宋体 size=3>好！我们找到了，原来校正的代码就在这里！仔细看看</font></p>
<p><font face=宋体 size=3>#if !defined (ACE_LACKS_CDR_ALIGNMENT)</font></p>
<p><font face=宋体 size=3>这里说明，如果你定义了ACE_LACKS_CDR_ALIGNMENT，那么ACE就不会帮你校准对齐字节啦！</font></p>
<p><font face=宋体 size=3>哈哈，是不是很兴奋？别着急，让我们动手</font></p>
<p><font face=宋体 size=3>打开config.h文件，加入以下一句</font></p>
<p><font face=宋体 size=3>#define ACE_LACKS_CDR_ALIGNMENT</font></p>
<p><font face=宋体 size=3>重新编译ACE，好，将新的lib加入工程</font></p>
<p><font face=宋体 size=3>（如果你用了aced.dll或ace.dll，注意路径，或把新的dll拷贝到system32目录下）</font></p>
<p><font face=Arial size=3><o:p>让我们来运行一下原来的程序</o:p></font></p>
<font face=Arial><o:p></o:p>
<p><font face=Arial size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out &lt;&lt; (ACE_CDR::UShort)1;</font></p>
<p><font face=Arial size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out &lt;&lt; (ACE_CDR::Long)2;</font></p>
<p><font face=Arial size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACE_LOG_MSG-&gt;log_hexdump( LM_DEBUG , mb-&gt;base() , out.length() , "t");</font></p>
<p><font size=3><font face=Arial>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><font face=宋体>字节将成为如下排列</font><font face=Arial>(16</font><font face=宋体>进制</font><font face=Arial>)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color=#ff3300>xx xx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xx xx xx xx</font></font></font></p>
<p><font face=Arial><font color=#000000 size=3><o:p></o:p></font></font></p>
<p><font face=Arial><font color=#000000 size=3><o:p>哈哈！你再试试以上四个例子，会发现都没有问题了！</o:p></font></font></p>
<p><font face=Arial><font color=#000000 size=3><o:p></o:p></font></font></p>
</font>
<p><font face=Arial size=3><o:p>那么，从现在开始，你还需要写自己的整编和解编的包装类吗？我看没有必要了吧。还不快动手修改你的工程？ <br></o:p></font></p>
<p>补充：</p>
<p>如果不这么做。那么在接收端用ACE_IntputCDR进行 &gt;&gt; 操作时。如果没有进行读时的强制转换</p>
<p>比如 没有这样写</p>
<p>ACE_CDR::Char c;</p>
<p>ACE_CDR::UShort s;</p>
<p>ACE_InputCDR in(...);</p>
<p>in &gt;&gt; (ACE_CDR::ULong)c;</p>
<p>in &gt;&gt; (ACE_CDR::ULong)s;</p>
<p>而是这样写：</p>
<p>ACE_InputCDR in(...);</p>
<p>in &gt;&gt;&nbsp;&nbsp;c;</p>
<p>in &gt;&gt; s;</p>
<p>必出各种字节乱码问题。因为中间多了CORBA的marshaling 与demarshaling对齐数据。</p>
<p>如果按照以上方法重新编译ACE后。即可省事多了（同时也节省了网络流量）</p>
<p>ACE_OutputCDR out(..);</p>
<p>out &lt;&lt; c;</p>
<p>out &lt;&lt; s;</p>
<p>------------------------------------</p>
<p>ACE_InputCDR in(...);</p>
<p>in &gt;&gt;&nbsp;&nbsp;c;</p>
<p>in &gt;&gt; s;</p>
<p>无须任何类型转换。绝不出错。</p>
<p>再次声明。你不必自己写整编和解编。该论坛多次讨论过该问题。这是一个非常好的解决之道。</p>
<p><font face=Arial size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out &lt;&lt; (ACE_CDR::UShort)1;</font></p>
<p><font face=Arial size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out &lt;&lt; (ACE_CDR::Long)2;</font></p>
<br>
<p><font face=Arial size=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ACE_LOG_MSG-&gt;log_hexdump( LM_DEBUG , mb-&gt;base() , out.length() , "t");</font><img height=21 alt="" src="http://blog.csdn.net/ruixj/archive/2008/02/21/skins/Default/toolbar/universalkey.gif" width=21></p>
<br>
<p>&nbsp;</p>
<br>
<p>&nbsp;</p>
<br>
<p>&nbsp;</p>
<p>书中第四章中有一段代码用到了ACE_CDR的"opertaor&gt; &gt; ()"提取操作符，对此有些疑问。 <br><br>代码大致如下 <br><br></p>
<dl class=code>
<dt>C/C++ code
<dd>
<pre>
<div><!--code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--><span style="COLOR: rgb(0,0,0)">ACE_InputCDR cdr(payload);  </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">payload 是一个ACE_Message_Block</span><span style="COLOR: rgb(0,128,0)"><br></span><span style="COLOR: rgb(0,0,0)"><br>ACE_CDR::Boolean byte_roder; </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">字节顺序标志<br></span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">Use helper method to disambiguate booleams from chars</span><span style="COLOR: rgb(0,128,0)"><br></span><span style="COLOR: rgb(0,0,0)">cdr </span><span style="COLOR: rgb(0,0,0)">&gt;&gt;</span><span style="COLOR: rgb(0,0,0)"> ACE_InputCDR::to_boolean(Byte_order);  </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">[color=#FF0000]puzzle1[/color]</span><span style="COLOR: rgb(0,128,0)"><br></span><span style="COLOR: rgb(0,0,0)">cdr.reset_byte_order(byte_order);             </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">[color=#FF0000]puzzle2[/color]<br><br></span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">提取payload的长度</span><span style="COLOR: rgb(0,128,0)"><br></span><span style="COLOR: rgb(0,0,0)">ACE_CDR::Ulong length;<br>cdr </span><span style="COLOR: rgb(0,0,0)">&gt;&gt;</span><span style="COLOR: rgb(0,0,0)"> length;     </span><span style="COLOR: rgb(0,128,0)">//</span><span style="COLOR: rgb(0,128,0)">[color=#FF0000]puzzle3</span></div>
<br></pre>
</dd></dl>[/color] <br><br><br>对上面的几行代码主要有2个疑问。 <br>问题一、puzzle1和puzzle3处 <br>cdr &nbsp; &gt; &gt; &nbsp; ACE_InputCDR::to_boolean(Byte_order); &nbsp; &nbsp; <br>cdr &nbsp; &gt; &gt; &nbsp; length; <br>这两个地方，cdr直接通过 &nbsp; &gt; &gt; &nbsp; 就提取出来了ACE_InputCDR::to_boolean(Byte_order)和length，请问这是怎么回事儿？ <br>是这两个部分的内容是按某种规定好的顺序就保存在cdr中的么？还是说在operator&gt; &gt; ()重载时，就已经对&gt; &gt; 后面的变量类型做了多态，以致&gt; &gt; 后面的内容类型不同，就自动从cdr中提取出不同的信息作为输出？ <br><br>问题二 &nbsp; puzzle和puzzle3处 <br>这两句代码书中的解释是cdr提取出payload中的&#8220;字节序标志&#8221;（byte_order）。然后，根据输入中指定的字节顺序，确定CDR流的字节顺序，提取具有不定长度的日志记录payload的长度。 <br><br>我的疑问是，既然cdr需要知道payloay的&#8220;字节顺序标志&#8221;（cdr.reset_byte_order(byte_order)），然后再提取 payload的长度（cdr &nbsp; &gt; &gt; &nbsp; length）。那么cdr &nbsp; &gt; &gt; &nbsp; ACE_InputCDR::to_boolean(byte_order)这句是从哪里提取出来的&#8220;字节顺序标志&#8221;，我怎么感觉就是从payloade 里提取出来的呢（ACE_InputCDR &nbsp; cdr(payload)）？ <br><br>盼各位执教，十分感谢！！ <br><br>
<table style="HEIGHT: 100%" cellSpacing=0>
    <tbody>
        <tr>
            <td class=content id=reply46789862_body csdnid="Reply_Body" name="reply_body">自己看看ACE的源码不就很清楚了．．我们接收到一个数据包之后（数据存放在ACE_Message_Block中），用ACE_InputCDR来对接收到数据进行解编（解析）， <br>那个byte_order就是接收到的数据的字节序标记．然后通过cdr.reset_byte_order(byte_order)告诉 ACE_InputCDR，它内部的ACE_Message_Block保存的数据是啥字字节序．．如果接收的数据的字节序和本地字节序不一样，那么 ACE_InputCDR解编的时候就会自动在内部进行字节序的转换</td>
        </tr>
    </tbody>
</table>
<img src ="http://www.cppblog.com/deadpunk/aggbug/44858.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/deadpunk/" target="_blank">活着就是折腾，所以当然要骠悍的折腾</a> 2008-03-19 15:44 <a href="http://www.cppblog.com/deadpunk/archive/2008/03/19/44858.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>