关于PPP数据帧转义字符0x7d后的字符第六个bit位取补码

凤梨头头 2016-04-25 10:26:41
C R C字段(或 F C S,帧检验序列)是一个循环冗余检验码,以检测数据帧中的错误。
由于标志字符的值是 0 x 7 e,因此当该字符出现在信息字段中时, P P P需要对它进行转义。
在同步链路中,该过程是通过一种称作比特填充 (bit stuff i n g )的硬件技术来完成的 [ Ta n e n b a u m
1 9 8 9 ]。在异步链路中,特殊字符 0 x 7 d用作转义字符。当它出现在 P P P数据帧中时,那么紧接
着的字符的第 6个比特要取其补码,具体实现过程如下:
1) 当遇到字符 0 x 7 e时,需连续传送两个字符: 0 x 7 d和0 x 5 e,以实现标志字符的转义。

7e 01111110→5e 01011110 ,自右向左第六位取反
就将0x7e转义为了0x7d 0x5e,可是此处不应该是自右向左第六位取补码吗?为什么第六位取补码后由1变为了0,我去查阅了RFC文档,此处的运算实际是和0x20进行异或。
我对此处所说的第六个比特取补码不太理解,取补码的定义不是正数补码为其本身,负数补码是取反再加1吗?某一比特位取补码到底是怎么实现的?
...全文
654 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
富东 2018-06-26
  • 打赏
  • 举报
回复
把7D变7E最有效率的方式是位运算
赵4老师 2016-04-27
  • 打赏
  • 举报
回复
引用 3 楼 wang0635 的回复:
补码跟求补不总是一回事 求补,求余,全集的补是空集,空集的补是全集,1的补是0,0的补是1
斩钉截铁!掷地有声!言之凿凿!
小灸舞 2016-04-26
  • 打赏
  • 举报
回复
感觉就是简单的对那个比特位求反,所以就是和0010 0000进行异或
凤梨头头 2016-04-26
  • 打赏
  • 举报
回复
引用 3 楼 wang0635 的回复:
补码跟求补不总是一回事 求补,求余,全集的补是空集,空集的补是全集,1的补是0,0的补是1
有点明白了,感谢!!
wang0635 2016-04-26
  • 打赏
  • 举报
回复
补码跟求补不总是一回事 求补,求余,全集的补是空集,空集的补是全集,1的补是0,0的补是1
凤梨头头 2016-04-26
  • 打赏
  • 举报
回复
引用 1 楼 qq423399099 的回复:
感觉就是简单的对那个比特位求反,所以就是和0010 0000进行异或
可是RFC文档说了是求补码哦,不是取反啊,搞不懂这个比特位求补码的结果怎么和求反相等. After FCS computation, the transmitter examines the entire frame between the two Flag Sequences. Each Flag Sequence, Control Escape octet, and any octet which is flagged in the sending Async-Control- Character-Map (ACCM), is replaced by a two octet sequence consisting of the Control Escape octet followed by the original octet exclusive-or’d with hexadecimal 0x20. This is bit 5 complemented, where the bit positions are numbered 76543210 (the 6th bit as used in ISO numbered 87654321 -- BEWARE when comparing documents).

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧