# 算术编码算法

算术编码是把一个信源表示为实轴上01之间的一个区间，信源集合中的每一个元素都用来缩短这个区间。

算术编码的过程如下：

（1）       设定编码区间的高段为h，编码区间的长度为gEndC为编码字符分配的高段，StartC

（2）       根据有限的信源估算出各元素的概率。

（3）       杜宇编码的元素A1，根据（2）估算的概率和区间，计算出该元素编码后的新的l，和h。其公式如下：

h = StartC + g* K;

l = Endc + g* K1;

const  Ca = 0.2;  Ce = 0.3;

Ci = 0.2;  Co = 0.2;

Cu = 0.1;

var

Form1: TForm1;

s: string;

StartC, EndC: Extended;

implementation

{\$R *.dfm}

procedure ConvertTo(s: string; var StartC, EndC: Extended);{将字符串变为数值}

var n, i: integer;

c: char;

g: Extended;

begin

StartC := 0;

EndC := 1;

n := Strlen(Pchar(s));

for i := 1 to n do

begin

c := s[i];

g := EndC - StartC;

case C of

'a':

begin

EndC :=StartC  + g * Ca;

StartC := StartC + g * 0;

end;

'e':

begin

EndC := StartC + g * (Ca + Ce);

StartC := StartC + g * Ca;

end;

'i':

begin

EndC := StartC + g * (Ca + Ce + Ci);

StartC := StartC + g * (Ca + Ce);

end;

'o':

begin

EndC := StartC + g * (Ca + Ce + Ci + Co);

StartC := StartC + g * (Ca + Ce + Ci);

end;

'u':

begin

EndC := StartC + g * (Ca + Ce + Ci + Co + Cu);

StartC := StartC + g * (Ca + Ce + Ci + Co);

end;

else

begin

Showmessage(' 输入的字符串有误 ');

exit;

end;

end;

end;

end;

procedure NemuricalToStr(var s: String; var StartC, EndC: Extended);

{将数值转换为字符串}

const eps = -1e-5;

begin

if StartC-0.2 < -eps  then

if (EndC- 0.2<= -eps) and (EndC > StartC) then

begin

StartC := StartC / 0.2;

EndC := EndC / 0.2;

s := s + 'a';

if (StartC <>0) or (EndC <> 1) then

NemuricaltoStr(s,StartC,EndC);

end;

if (StartC- 0.2 >= eps) and (StartC-0.5 < -eps) then

if (EndC-0.5<= -eps) and (EndC>StartC) then

begin

StartC := StartC - 0.2;

EndC := EndC - 0.2;

StartC := StartC / 0.3;

EndC := EndC / 0.3;

s := s + 'e';

if (StartC <>0) or (EndC <> 1) then

NemuricaltoStr(s,StartC,EndC);

end ;

if (StartC- 0.5>= eps) and (StartC- 0.7< -eps) then

if (EndC-0.7<= -eps) and (EndC>StartC) then

begin

StartC := StartC - 0.5;

EndC := EndC - 0.5;

StartC := StartC / 0.2;

EndC := EndC / 0.2;

s := s + 'i';

if (StartC <>0) or (EndC <> 1) then

NemuricaltoStr(s,StartC,EndC);

end ;

if (StartC-0.7 >= eps) and (StartC-0.9 < -eps) then

if (EndC-0.9<=-eps) and (EndC>StartC) then

begin

StartC := StartC - 0.7;

EndC := EndC - 0.7;

StartC := StartC / 0.2;

EndC := EndC / 0.2;

s := s + 'o';

if (StartC <>0) or (EndC <> 1) then

NemuricaltoStr(s,StartC,EndC);

end ;

if (StartC -0.9>=eps) and (StartC-1 < -eps) then

if (EndC-1<= -eps) and (EndC>StartC) then

begin

StartC := StartC - 0.9;

EndC := EndC - 0.9;

StartC := StartC / 0.1;

EndC := EndC / 0.1;

s := s + 'u';

if (StartC <>0) or (EndC <> 1) then

NemuricaltoStr(s,StartC,EndC);

end;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

s := Edit1.Text;

ConvertTo(s,StartC,EndC);

Edit2.Text := FloattoStr(StartC);

Edit3.Text := FloattoStr(EndC);

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

s := '';

StartC := StrToFloat(Edit2.Text);

EndC := StrtoFloat(Edit3.Text);

NemuricalToStr(s,StartC,Endc);

Edit1.Text := s;

end;

end.

• 本文已收录于以下专栏：

## 基本算术编码

1.基本思想 算术编码，就是用一个数编码一串字符串。
• l294265421
• 2017年01月15日 01:21
• 1724

## 算术编码的原理与分析

• szu030606
• 2010年10月08日 17:01
• 11099

## 算术编码的原理和MATLAB实现

• qingkongyeyue
• 2017年07月04日 15:25
• 768

## 算术编码（Arithmetic Coding）源代码

Ian H. Witten、Radford M. Neal和John G. Cleary在1987年发表了一篇启发性的论文。论文中描述了一种基于整数运算的通用算术编码器，而且还给出了由计算错误导致的...
• szu030606
• 2010年10月08日 16:55
• 3014

## 数据压缩，算术编码

• u011954647
• 2016年01月04日 15:49
• 1031

## 图像压缩——算术编码

• u010798503
• 2016年11月22日 20:56
• 1342

## matlab实现算术编解码

• u010839382
• 2014年06月01日 23:01
• 3387

## 二进制算术编码器的C语言实现

• gaussrieman123
• 2016年09月18日 17:01
• 1209

## CABAC 基础二-算术编码

1.  算术编码 与变长编码不同，算术编码的本质是为整个输入序列分配一个码字，而不是给每个字符分别指定码字，因此平均意义上可以为单个字符分配码长小于1的码字。 算术编码用到两个基本的参数：符号的概率和...
• shakingWaves
• 2016年09月03日 23:18
• 2428

## 算术编码

算术编码· Arithmetic Coding                            suhang    历史背景— 朝熵的极限迈进 早在1948年，香农(Claude E.Shan...
• suhangpro
• 2009年05月10日 16:31
• 1331

举报原因： 您举报文章：算术编码算法 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)