1. 程式人生 > >鏈路層的編碼研究(2)最簡單的編碼方式

鏈路層的編碼研究(2)最簡單的編碼方式

上次的程式中,已經實現好了基類的搭建,現在實現一種最簡單的編碼方式。

編碼方式為:在資料的頭部和尾部加入:01111110,在資料中,只要出現5個1,就在後面新增0。

問題的一個難點在於:變化之後的資料很可能不再是8的整數倍,我將最後的幾個位空出來,設定為0,來湊齊8的整數位。此類命名為:SimpleCoder,在coder.h中實現,總的coder.h程式碼如下:

// coder.h

#ifndef CODER_H
#define CODER_H

#include "datareader.h"
#include <iostream>
#include <vector>

class Coder
{
protected:
	unsigned char* storage;
	int size;
	int length;
	DataReader& data;
	int prtlen;
public:
	Coder(DataReader* dr) : data(*dr)
	{
		storage = data.storage;
		size = data.size;
		length = data.length;
		prtlen = size * length;
	}
	void update()
	{
		storage = data.storage;
		size = data.size;
		length = data.length;
		prtlen = size * length;
	}
	DataReader& getDataReader()
	{
		return data;
	}
	// This print function show how to show the magic memory.
	// But I will use the real magic memory method,
	// because it's easy to code and decode.
	/*std::ostream& print(std::ostream& out)
	{
		for (int i = 0; i < length; i++)
			for (int j = size - 1; j >= 0; j--)
				for(int k = 7; k >= 0; k--)
					if (storage[i * size + j] & (1 << k))
						out << 1;
					else
						out << 0;
		return out;
	}*/
	std::ostream& print(std::ostream& out)
	{
		for (int i = 0; i < prtlen; i++)
			for (int j = 7; j >= 0; j--)
				if (storage[i] & (1 << j))
					out << 1;
				else
					out << 0;
		return out;
	}
	void print()
	{
		print(std::cout);
	}
	
	virtual void code() {}
	//virtual void decode() = 0;
};

std::ostream& operator<<(std::ostream& out, Coder& coder) {
		return coder.print(out);
}

class SimpleCoder : public Coder
{
	void addFlag(std::vector<unsigned short>& data)
	{
		data.push_back(0);
		for (int i = 0; i < 6; i++)
			data.push_back(1);
		data.push_back(0);
	}
public:
	SimpleCoder(DataReader* dr) : Coder(dr){}

	void code()
	{
		std::vector<unsigned short> data;
		addFlag(data);
		int count = 0;
		for (int i = 0; i < prtlen; i++)
			for (int j = 7; j >= 0; j--)
			{
				if (count == 5)
				{
					data.push_back(0);
					count = 0;
				}
				if (storage[i] & (1 << j))
				{
					data.push_back(1);
					count++;
				} else {
					data.push_back(0);
					count = 0;
				}
			}
		addFlag(data);
		unsigned char* store = new unsigned char[data.size() / 8 + 1];
		for (int i = 0; i < data.size() / 8 + 1; i++)
		{
			store[i] = 0;
			for (int j = 7; j >= 0; j--)
				if (7 - j + 8 * i < data.size())
					store[i] |= (data[7 - j + 8 * i] << j);
		}
		delete [] storage;
		storage = store;
		prtlen = data.size() / 8 + 1;
	}
};


#endif

測試程式碼如下:

//test.cpp
#include <iostream>
#include "coder.h"
using namespace std;

int main()
{
	int a[] = {1, 4, -1};
	SimpleCoder coder(new DataReader(a, 3));
	cout << coder << endl;
	coder.code();
	cout << coder << endl;

	DataReader& dr = coder.getDataReader();
	dr.setStorage('a');
	coder.update();
	cout << coder << endl;
	char s[] = "aaaab";
	dr.setStorage(s, 6);
	coder.update();
	cout << coder << endl;

	return 0;
}

執行結果:


相關推薦

編碼研究(2)簡單編碼方式

在上次的程式中,已經實現好了基類的搭建,現在實現一種最簡單的編碼方式。 編碼方式為:在資料的頭部和尾部加入:01111110,在資料中,只要出現5個1,就在後面新增0。 問題的一個難點在於:變化之後的資料很可能不再是8的整數倍,我將最後的幾個位空出來,設定為0,來湊齊8的整

TCP/IP學習筆記(2)-數據

方案 網絡 n) 以及 設備 ima img 控制 不同的 數據鏈路層有三個目的: 為IP模塊發送和接收IP數據報。 為ARP模塊發送ARP請求和接收ARP應答。 為RARP發送RARP請求和接收RARP應答 ip大家都聽說過。至於ARP和RARP,ARP叫

TCP/IP學習筆記(2)---數據

可見 請求 ram pac 方式 這一 erro span loop TCP/IP學習筆記(2)---數據鏈路層 數據鏈路層有三個目的: 為IP模塊發送和 接收IP數據報。 為ARP模塊發送ARP請求和接收ARP應答。 為RARP發送RARP請 求和接收RARP

TCP-IP詳解卷1:協議 學習筆記(2)

參考:TCP-IP詳解卷1:協議 鏈路層的三個主要目的: (1)為IP模組傳送和接收IP資料報 (2)為ARP模組傳送ARP請求和接收ARP應答 (3)為RARP傳送RARP請求和接收RARP應答。 乙太網一般是指Digital Equipment Crop.、In

2.4G頻段--各個協議通道對映

 2.4G頻段是非常擁擠的,原因就是免費。以下是大致的一個分佈。 wifi 藍芽 微波爐 業餘無線電 學生時期,用過很多種無線模組(某寶上都有): 藍芽模組:HC-05、HC-06 2.4G無線模組:nrf24l01 wi

TCP-IP詳解筆記2:

1. 鏈路層的作用 1 為IP模組傳送和接受IP資料報 為ARP模組傳送ARP請求和ARP應答。 為RARP傳送RARP請求和RARP應答。 2. 幀的格式 SLIP: serial line i

《計算機網路》知識總結-2.物理、網路

物理層 主要是解決通道的問題, 涉及的技術:【訊號的調製解調技術】 採用的裝置:【modern(俗稱 貓)】 【modern】 其實就是Modulator(調製器)與Demodula-tor(解調器)的簡稱。所謂調製,就是把數字訊號轉換成

【網絡】 數據筆記

出現 雙絞線 穩定性 同時 節點 計算 只需要 blog less 數據鏈路層   簡稱鏈路層,功能在於將數據包封裝成幀,控制幀對介質的訪問。鏈路層連接了物理介質和其之上抽象層,可以使上層不用關心用什麽方法在什麽介質中傳輸信息。   在幀被傳輸時經過的每一跳,每個中間設

第4章 數據(4)_擴展以太網

style 由於 crc prior 運行 選擇 兩個 需要 指定端口 4. 擴展以太網 4.1 集線器(hub) (1)集線器組網   ①10BASE-T雙絞線以太網的通信距離短,每個站到集線器的距離不超過100m(註意,10表示10Mb/s的數據傳輸率,BASE表示連接

第4章 數據(5)_高速以太網

網絡 1.3 cell 增加 pan ble 雙工 網段 數據鏈路 5. 高速以太網 5.1 100M以太網 快速以太網(100M)標準 名稱 傳輸介質 網段最大長度 特點 100BASE-TX 銅纜 100m 兩對UTP5類線或屏

負載均衡之數據

和數 負載均衡 ont fonts 正常 south 機器 身份證號 處理 在TCP/IP協議中數據鏈路層處於最底層,以幀的形式傳輸和接受數據。在這一層中MAC(Media Access Control)尋址是主要功能。在網絡中MAC又稱之為MAC地址,用於表示互聯網上每

數據協議

數據 鏈路 tdm 無線網絡 aoe 是否 但是 時延 檢測 CSMA/CD:帶有沖突檢測的多路訪問。(半雙工)。監聽網絡是否能發送。檢測到沖突,則延遲一個隨機時延再度發送數據。不能避免碰撞。 CSMA/CA:對通信進行預約。盡量避免沖突。A向B發送請求。B同意的話則回執,

tcp/ip 學習筆記 章二

tcp/ip一、數據鏈路層當需要在一條線路上傳遞數據時,除了必須使用一條物理設備時,還需要一些必要的通信協議來控制數據的傳輸,若把實現這些協議的硬件和軟件的加到鏈路上,就叫做數據鏈路;最常用的是-----網絡適配器。一般適配器都包含了數據鏈路層和物理層這兩層的功能。物理層的包含多種與物理介質相關的協議和標準物

計算機網絡 chapter3數據

計算機網絡 接入控制 網絡 有關 協議 支持 轉換 item csma/cd 第三章 數據鏈路層 定義了在單個鏈路上如何傳輸數據。這些協議與被討論的各種介質有關。示例:ATM,FDDI等。 數據鏈路層使用的信道主要有以下兩種: 點對點信道:使用一對一的點對點通信方式 廣播信

OSI七詳解之二 數據(DataLinkLayer)

必須 sdl -s 通過 鏈路層 family ram style ora 一、簡介   在物理層提供比特流服務的基礎上,建立相鄰結點之間的數據鏈路,通過差錯控制提供數據幀(Frame)在信道上無差錯的傳輸,並進行各電路上的動作系列。    數據鏈路層在不可靠的物理介質上提

- SLIP,PPP,

ack 其它 nat col 數據報 有一個 acc 點對點 分組 最常使用的封裝格式是RFC 894定義的格式。圖2 - 1顯示了兩種不同形式的封裝格式。圖中每一個方框以下的數字是它們的字節長度。

計算機網絡【三】:數據 【轉】

緩存 strong mac 幾分鐘 tcp協議 tran 可靠性 如何 wid 轉自:http://blog.chinaunix.net/uid-26275986-id-4104189.html 按照TCP/IP協議由下往上的順序,今天我們來學習一下數據鏈

第三章 數據(一)

哪裏 還要 發送 數據鏈路層 這一 都是 簡單 包含 封裝成幀       序言         我是一只菜鳥,又來了。開始今天數據鏈路層的學習吧。                                                               

第三章 數據(二)

work int layer 通信協議 因特網 區別 如何 流程 特點     序言         也沒什麽好說的,只能說繼續努力,終有一天會撥開雲霧見青天。                                                        

【計算機網絡基礎】數據(目錄)

計算機網絡 劃分 靜態 控制 網橋 透明 回退 csma/cd 廣播 數據鏈路層知識結構 數據鏈路層組幀和透明傳輸 數據鏈路層差錯檢驗 奇偶校驗 循環冗余校驗(CRC) 海明碼 數據鏈路層可靠傳輸(ARQ協議) 停止-等待協議 回退N幀協議(GBN協議) 選擇重傳協