Php 对可变位宽二进制块中的十进制值进行编码/解码

Php 对可变位宽二进制块中的十进制值进行编码/解码,php,encoding,bit-manipulation,binary-data,Php,Encoding,Bit Manipulation,Binary Data,我正试图为我正在设计的一个网络个人项目中的协议构建一个可变比特宽度的二进制编码器/解码器。。。我愚蠢的大脑完全被如何掌握可变比特宽度的二进制编码/解码所困扰。我已经盯着同一个~18 SLOC看了大约四天了,我仍然觉得自己完全不知所措。我确实觉得我应该能够理解这一点,但不幸的是,当我试图追踪不同的数字关系时,我的大脑会随机崩溃:( 理论上,我想做的非常简单。我声明了一个比特宽度列表,以及我想存储在该比特宽度中的值,如下所示: [10 bits]: 1013 [1 bit ]: 1 [2 bit

我正试图为我正在设计的一个网络个人项目中的协议构建一个可变比特宽度的二进制编码器/解码器。。。我愚蠢的大脑完全被如何掌握可变比特宽度的二进制编码/解码所困扰。我已经盯着同一个~18 SLOC看了大约四天了,我仍然觉得自己完全不知所措。我确实觉得我应该能够理解这一点,但不幸的是,当我试图追踪不同的数字关系时,我的大脑会随机崩溃:(

理论上,我想做的非常简单。我声明了一个比特宽度列表,以及我想存储在该比特宽度中的值,如下所示:

[10 bits]: 1013
[1  bit ]: 1
[2  bits]: 3
[19 bits]: 51209
考虑到比特宽度,值将逐步排序为二进制字符串,如下所示:

               1 bit
               | 2 bits  
               | ||  
  /-10 bits--\ | \/ /------ 19 bits ------\  
  12345678  12 3 45 678  12345678  12345678  
  11111101  01 1 11 000  11001000  00001001  
  \----------/ | \/ \---------------------/
      1012     1  3          51209
上面粗体显示的比特流是我通过线路传输的:

11111101  253  FD
01111000  120  78
11001000  200  C8
00001001    9  09
在另一端,我将列表
{10,1,2,19}
(顶部表示的一组比特宽度)映射到我接收到的字节序列,然后留下我想要传输的原始值集

虽然这主要是一个一般的算法问题,任何特定语言的语义都可以说是无关紧要的,但我应该提到的是,我使用PHP就是为了解决这个问题——我之所以如此困惑的部分原因是,我试图找出如何避免使用字符串操作,而PHP似乎偏执地倾向于鼓励使用字符串操作优先于正确的数字处理。然而,这个函数(希望)将以2到3位Mbps的速度处理数据,我希望例程尽可能快。(顺便说一句,我会使用另一种语言,但PHP是我知道得最多的>\u>)

我确实理解二进制的基础知识,我应该强调我确实有一个工作的编码器,我想(它向后输出二进制数据)-但我不知道我在这里做什么。我不是问“我如何编写这个函数”,我是问“我在做什么的结构力学以及我如何理解它。”


我还应该注意到,这个问题并不是一个简单的家庭作业练习;它是针对我正在设计的个人软件项目中的网络库组件,希望它能教会我关于网络、事件处理和并发性的知识。希望我能掌握我需要实现的所有其他东西……哈哈哈,给你一点建议startpoint这样一个二进制解码器/编码器的样子如下示例:

data:    1013
bitMask:   10
那么,这背后的概念是什么

非常简单,我循环遍历您要发送的每个数据,并将它们拆分为单个字节。例如:

data:    1013
bitMask:   10
所以我首先计算发送它需要多少字节,这里是2字节,每字节8位

经过所有的准备和计算后,很容易将所有数据逐字节逐位发送!因此,如果我们从上面的示例来看,这将类似于:

数据:1013->0000'0011111'0101
位掩码:10
字节总数:2
1.字节=1111'0101
2.字节=0000'0011
因此,在发送数据时(此处为浏览器中的输出),您将以相反的方式显示数据!因为当您接收数据时,您将其更改回原来的状态,并获得正确的结果


你能分享你已经尝试过的吗?请添加你已经尝试过的内容/尝试,并展示你正在寻找的内容(尽可能具体)!