【发布时间】:2013-11-11 22:31:11
【问题描述】:
对于一个完整的背景(你不需要真正理解这一点来理解问题,但它可能会有所帮助)我正在编写一个通过以太网发送数据的 CLI 程序,我希望添加 VLAN 标记和优先级标记到以太网标头。
我面临的问题是我有一个 16 位整数值,它由三个较小的值组成:PCP 是 3 位长(所以 0 到 7),DEI 是 1 位,然后是 @987654323 @ 是 12 位长 (0-4095)。 PCP 和DEI 一起构成第一个 4 位半字节,VLANID 的 4 位相加完成第一个字节,VLANID 的其余 8 位构成整数的第二个字节。
11123333 33333333
1 == PCP 位,2 == DEI 位,3 == VLANID 位
让我们假设PCP == 5,二进制是 101,DEI == 0,VLANID == 164,二进制是 0000 10100011。首先我需要将这些值编译在一起,如下所示以下:
10100000 10100101
然后我面临的问题是,当我将此整数复制到要编码到线路(以太网介质)上的缓冲区中时,位顺序会发生如下变化(我在将整数复制到之前以二进制形式打印出我的整数电线并使用wireshark将其捕获在电线上进行比较):
内存中的位顺序:abcdefgh 87654321
线路上的位顺序:8765321 abcdefgh
我真的有两个问题:
- 首先是通过将三个较小的整数“粘”在一起来创建 2 字节整数
- 第二个是确保位的顺序是正确编码到线路上的顺序(因此字节的顺序不是相反的)
显然我已经尝试过这段代码以达到这一点,但我真的超出了我的深度,希望从头开始看到某人的建议,而不是发布我到目前为止所做的事情以及有人建议如何改变它以一种可能难以阅读和冗长的方式执行所需的功能。
【问题讨论】:
-
查看 ntoh 和 hton(网络到主机和主机到网络)。问题是大/小端。
-
使用
hton系列函数来处理这个问题。
标签: c++ bit-manipulation