使用Java实现字节填充
需要字节填充
在数据链路层的可变大小帧中,我们需要定义一种方法来将一帧与下一帧分开。字节填充用于完成任务。在字节填充中,在帧的开头和结尾添加一个 8 位标志 ('F'),从而区分一帧和下一帧。因此,每次遇到标志序列 ('F') 时,它都表示帧的开始或结束。然而,如果标志模式('F')会出现在帧本身携带的数据中,这种巧妙的方案会产生差异。字节填充在这里起到了拯救作用,通过在标志模式之前用额外的 8 位转义序列 ('E') 填充原始数据,只要它发生在帧承载的数据中。然后接收器必须对转义序列进行去填充,以获得原始数据。
此时可能出现的一个简单问题是,如果转义序列 ('E') 构成要发送的数据的一部分会怎样!这种情况的处理方式与上述完全相同,即在构成数据一部分的转义序列之前将额外的 8 位转义序列 ('E') 添加到原始数据。
在面向字符的协议中,要携带的数据是 8 位字符,字节填充被用来处理上面讨论的问题。
为了简单起见,我们将只考虑发送数据中的三种类型的字节序列,如下:
F : 标志序列
E : 转义序列
D :任何其他数据序列
例如 :
At Sender Side
Enter the Message to be Sent :
DDEDFFDE
The data being sent (with byte stuffed) is : FDDEEDEFEFDEEF
Sending Message....
Thanks for the Feedback Server!!
At Receiver Side
Message Received...Successfully!!!
The Stuffed Message is : FDDEEDEFEFDEEF
The Destuffed Message is : DDEDFFDE
Messaging is over.....EXITING
从上面的例子我们可以看到在接收端是如何恢复原始数据的。
方法
在发送方(客户端)端
- 发送方每帧的数据,首先在每帧的开头和结尾填充8位标志序列('F')。
- 接下来,扫描数据以查看是否有任何类似的标志序列 ('F') 构成它的一部分。如果是,则在每个这样的标志序列之前,填充一个额外的转义序列('E')。
- 现在,如果发现任何类似的转义序列 ('E') 构成要发送的数据的一部分,则在每个这样的转义序列出现之前填充一个额外的转义序列 ('E')。
- 最后,这个填充数据由发送者发送。
- 接收器跳过接收到的数据的第一个和最后一个字节,因为它们仅用于分别表示一帧的开始和结束,并且不携带任何有用的数据。
- 从下一个字节开始扫描病房数据,如果连续找到两个转义序列('E'),则对第一个进行去填充。类似地,如果转义序列后面跟着一个标志序列 ('F'),则前者被去填充。
- 该策略有助于接收方准确地恢复实际发送的数据。