电报 编码

此文章是由计算机编码而联想到的

计算机在处理和发送数据时需要编码,而电报机在发送电报时,也需要编码。

电报是欧美人发明的,早期在发送电报时,都会使用莫尔斯编码,将字母或数字编码,然后利用电报机发送,而莫尔斯编码就是用点和划的组合来表示一个字符。

之后,电报传到了入了天朝,而中国写的是汉字,不是英文字母,所以需要另外一套编码。

1873年 -中国最早的汉字电码

  由于汉字由许多部首组成,结构复杂,字型繁多,一个字一个"面孔",拍电报不直接用电码来表示。因此,采用由四个阿拉伯数字代表一个汉字的方法,简称"四码电报", 中国汉字多达6万字,常用的汉字只有一万个, 所以用10的4次方(10,000)来表示("四码电报"的来历)。1873年,法国驻华人员威基杰(S·A·Viguer)参照《康熙字典》的部首排列方法,挑选了常用汉字6800多个,编成了第一部汉字电码本,名为《电报新书》。后由我国的郑观应将其改编成为《中国电报新编》。这是中国最早的汉字电码本。

所以说,我们发送一封中文电报,需要经过2次编码,先将中文编成四码,然后再将每个数字编成对应的莫尔斯编码。最后通过电建的敲击发送给对方。 

在发报时,发报员如果使连接发报机与接收机的电路接通时间长一些,接收机就会产生一声“嗒”,如果接通时间稍微短一些,接收机就会产生一生“嘀”,这样交替着发送长短信号(分别用”━ “,”.“),几个信号连在一起就可以代表一个字母和符号,当然,信号和信号间,字母和字母间也要有一定时间间隔,否则就会使接收方无法辨认,混在一起。

以下就是莫尔斯对字母和数字用“嘀”、“嗒”的表示方法,也就是传说中的莫尔斯码:

A ·━

B ━··

C ━·━·

D ━··

E ·

F ··━·

G ━ ━ ·

H ····

I ··

J ·━ ━ ━

K ━·━

L ·━··

M ━ ━

N ━ ·

O ━ ━ ━

P ·━ ━·

Q ━ ━ ·━

R ·━·

S ···

T ━

U ··━

V ···━

W ·━ ━

X ━··━

Y ━··━

Z ━ ━··

1 ·━ ━ ━ ━

2 ··━ ━ ━

3 ···━ ━

4 ····━

5 ·····

6 ━····

7 ━ ━···

8 ━ ━ ━··

9 ━ ━ ━ ━·

0 ━ ━ ━ ━ ━

? ··━ ━··

/ ━··━·

( ) ━·━ ━ ·━

- ━····━

。 ·━·━·━

莫尔斯码的余光

在二战后,计算机、有线电话、手提电话、互联网先后走进了人们的生活,电报逐渐退出了历史舞台。在计算机和数字通信中,无论是眩目电脑游戏画面,还是悦耳动听的音乐,背后都是由一个个“1”,“0”的二进制代码进行计算和传输。有人曾设想在计算机中继续使用莫尔斯码,将电报中的长和短分别换成“1”,“0”,但不幸的是,莫尔斯码中代表每一个字母和数字的代码长度会不同,有的只有一个,有的却长达六个,这种方式不方便于计算机的运算,于是设计出了一种新的标准——ASCII码:

所有的大小写字母、数字、符号都统一使用八位二进制数字(两位十六进制数字)表示。

到1999年,莫尔斯码不再继续作为一种国际标准使用,正式退出了历史舞台。不过很多领域中,它仍然发挥着余热。

最著名的例子要数SOS求救信号了,在莫尔斯码中,字母S是三声短,字母O是三声长,从二十世纪初到今日,“嘀嘀嘀, 嗒嗒嗒, 嘀嘀嘀”一直作为作为国际通用的求救信号。

在电影《尼罗河上的惨案》中,主人公大侦探波洛发现身边有一条眼镜蛇时,不敢大声求救,而轻轻地敲击墙壁,敲出类似于“嘀嘀嘀,嗒嗒嗒,嘀嘀嘀”的声音来通知隔壁的上校军官来救他。

### 哈夫曼编码应用于电报密码 #### 编码原理 哈夫曼编码是一种变长编码方式,其核心在于构建一棵二叉树——即哈夫曼树。这棵树基于字符出现的概率分布而建立,在该树上左分支通常表示0,右分支表示1。对于给定的一组符号集以及相应的概率分布,通过最小化加权路径长度来优化编码效率[^1]。 当应用于电报通信时,可以借鉴摩尔斯电码的设计思路,即将发送消息中的各个字符按频次降序排列并分配不同的位串作为它们各自的编码形式;其中高频使用的字符获得较短的编码序列,低频者则相反。这种策略有助于减少整个报文所需的总比特数,从而加快传输速度并节省资源[^2]。 #### 实现过程 以下是创建哈夫曼编码的一个简单Python程序: ```python import heapq from collections import defaultdict, Counter def huffman_encoding(data): frequency = dict(Counter(data)) heap = [[weight, [symbol, ""]] for symbol, weight in frequency.items()] heapq.heapify(heap) while len(heap) > 1: lo = heapq.heappop(heap) hi = heapq.heappop(heap) for pair in lo[1:]: pair[-1] = '0' + pair[-1] for pair in hi[1:]: pair[-1] = '1' + pair[-1] heapq.heappush(heap, [lo[0]+hi[0]] + lo[1:] + hi[1:]) return sorted(heapq.heappop(heap)[1:], key=lambda p: (len(p[-1]), p)) data = "this is an example of a huffman tree" encoding = huffman_encoding(data) encoded_dict = {a:b for a,b in encoding} print("Character".ljust(10) + "Frequency".ljust(10)+ "Huffman Code") for char,freq in Counter(data).items(): print(f"{char}".ljust(10),f"{freq}".ljust(10), encoded_dict[char]) ``` 此代码片段展示了如何根据输入字符串`data`计算各字符频率,并据此生成对应的哈夫曼编码表。最后打印出了每个字符连同它所占比例及最终得到的独特编码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值