对于完整的背景(您并不需要真正理解这一点来理解问题,但它可能会有所帮助)我正在编写一个通过以太网发送数据的 CLI 程序,我希望将 VLAN 标记和优先级标记添加到以太网标头。
我面临的问题是我有一个 16 位整数值,它由三个较小的值构成:PCP
3 位长(所以 0 到 7),DEI
1 位,然后VLANID
是 12 位长(0-4095)。PCP
并DEI
一起形成第一个 4 位半字节,4 位从VLANID
添加完成第一个字节,其余 8 位从VLANID
形成整数的第二个字节。
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 字节整数
- 第二个是确保位的顺序是正确编码到线路上的(所以字节不是相反的顺序)
显然,我已经尝试过这段代码来做到这一点,但我真的超出了我的深度,希望从头开始看到某人的建议,而不是发布我到目前为止所做的事情以及有人建议如何将其更改为以可能难以阅读和冗长的方式执行所需的功能。