时间:2020-12-08 | 编辑:E航网 | 阅读:509 | 分享: |
关于印发自动识别系统中文编码规则的通知
海船舶﹝2011﹞543号 2011年8月24日
各有关单位:
为充分发挥国内航行船舶船载自动识别系统(AIS)设备的航海安全保障作用,统一AIS中文信息的收发方式,我局组织制定了AIS中文编码规则,现予印发,请遵照执行。
各AIS设备生产厂家要在设备安装上船前设定中文编码规则。对已安装上船的AIS设备,各生产厂家要及时组织对其设备进行升级,最迟不晚于2012年7月1日前完成。
自动识别系统中文编码规则
ITU-R M.1371-1《 在VHF海上移动频段采用时分多址(TDMA)技术的通用船载自动识别系统(AIS)的技术特性》规定,消息中收发的字符应采用其《6位ASCII字符码和8位标准ASCII字符码的对照表》(以下简称对照表)中的6位ASCⅡ码。本方案明确了在消息中使用汉字交换信息的方法,以使规定使用6位ASCII码收发信息的船载自动识别系统,能用汉字代码收发信息。
本方案适用于消息6和消息8内用中文表示的信息内容,其它有收发汉字需要的消息可参照使用。
2.代码定义
(1)收发中文信息的应用标示码
消息6和消息8中二进制数据域内,应用标示码中DAC给定为413,FI给定为01,让收发双方知道以下收发的是含汉字代码的收发代码。
(2)机内码
机内码是一般嵌入式计算机拥有的含汉字代码的编码,即单字节8位二进制数,第8位为“0”,表示标准ASCII字符代码;双字节16位二进制数,两个字节第8位都为“1”,表示GB2312基本集汉字代码。机内码用于船载自动识别系统计算机的字符和汉字的存储、处理。
(3)收发代码
收发代码是一种含13位GB2312基本集汉字代码的编码,其具体组成和与机内码的互相转换见第4节;收发代码是AIS在收发信息时使用的ASCII字符代码和汉字代码。
3.收发双方约定
(1)船载自动识别系统收发消息时,其初始字符编码默认采用对照表的6位ASCII码;
(2)当且仅当消息6和消息8收发的应用标示码中DAC为413且FI为01后,船载自动识别系统收发的字符编码采用含汉字代码的收发代码;消息收发结束,系统恢复默认采用对照表的6位ASCII码。
4.收发代码及其同机内码的互相转换
收发代码用1个7位码表示ASCII字符代码,即第7位(最高位)为“0”,余下6位为对照表的6位ASCII码;收发代码用2个7位码共14位表示汉字代码,即第14位(最高位)为“1”,余下13位为表示GB2312基本集的汉字13位代码。
收发代码和机内码的转换方法见附件。
附件
收发代码和机内码的转换方法
1.收发代码和机内码互相转换的方法
(1)机内码转换为收发代码的方法
取一个字节8位的机内码记为x1;
如果x1的第8位为“0”,则为标准ASCII码,按下列转换算法转换为7位表示ASCII字符的收发代码y1:
式中:
y1 ——7位有效;
0x ——表示其后是16进制数字,下同。
如果x1的第8位为“1”,则为汉字代码,取第二个字节8位机内码x2,将x1、x2的第8位清成“0”,x1、x2即为机内码表示汉字的14位代码,第一字节x1记为A,低7位有效,第二字节x2记为B,低7位有效;转换成收发代码表示汉字的13位代码,第一字节记为a,低6位有效,第二字节记为b,低7位有效;转换算法如下:
式中:
* ——乘法;
/ ——除法;
取商 ——x除以y,结果仅用整数商;
x % y ——x除以y,结果仅用余数;
将13位汉字代码a、b,其字节a的第7位置“1”,并将a、b记为y1、y2,即构成14位表示汉字的收发代码。
(2)收发代码转换为机内码的方法
取一个7位的收发代码记为y1;
如果y1的第7位为“0”,则表示6位ASCII码,按下列转换算法转换为8位表示ASCII字符的机内码x1:
如果y1的第7位为“1”,则为汉字代码,取第二个7位的收发代码y2,将第1字节y1的第7位清“0”,y1、y2即为收发代码表示汉字的13位代码,第一字节y1记为a,低6位有效,第二字节y2记为b,低7位有效;转换成机内码表示汉字的14位代码第一字节记为A,低7位有效,第二字节记为B,低7位有效;转换算法如下:
式中:
* ——乘法;
/ ——除法;
取商 ——x除以y,结果仅用整数商;
x&y ——x按位与y。
将14位汉字代码A、B,其两个字节第8位置“1”,记为x1、x2,即构成16位表示汉字的机内码。
2.实施举例
使用计算机编程语言C编写程序,使消息6和消息8,应用标示码中DAC为413且FI为01时,用含中文信息的收发代码收发信息。本实施例显示和描述了本方案的原理和特征,实际使用不受此例的限制。
函数xToY_send和yToX_receive、AB14_to_ab13()和ab13_to_AB14()实施了本方案的算法;其它函数与本方案关系不大,故程序略。
unsigned char a,b,AA,BB;
unsigned char sendData[162]; //要发送的机内码。
unsigned char receiveData[162]; //收到的已转换的机内码。
void AB14_to_ab13(); //将14位汉字码AA,BB转换为汉字13位码a,b。
void ab13_to_AB14(); //将汉字13位码a,b转换为14位汉字码AA、BB。
void send_8bit(unsigned char y); //将y的8位送入发送数据区,程序略。
void send_7bit(unsigned char y); //将y的低7位送入发送数据区,程序略。
unsigned char receive_7bit(); //从接收数据区取7位值作为返回值,程序略。
/*---------------------------------------------------
** 函数名:xToY_send
** 功能: 在消息6或消息8发含中文信息的收发代码时调用。发出DAC为413且FI为01;将数组sendData中的机内码转换为收发代码,送入发送数据区。机内码的汉字代码转换为汉字13位码时,调用函数AB14_to_ab13()。
** 输入:sn,要转换的数组元素个数;
数组sendData,元素是机内码。
** 输出:函数send_8bit(c),把8位码送入发送数据区;
函数send_7bit(c),把7位收发代码送入发送数据区。
-------------------------------------------------------
void xToY_send(sn)
unsigned char sn;
{
unsigned char i,x1,x2,y1,y2;
i=0;
x1=0x67;x2=0x41; // DAC为413且FI为01即0x6741送入发送数据区。
send_8bit(x1); //把8位码x1送入发送数据区。
send_8bit(x2); //把8位码x2送入发送数据区。
while(i<sn) //循环直至(sn)个。
{
x1=sendData[i]; //x1取机内码。
i++;
if(x1<0x80)
{ //x1最高位为0,x1转换为7位收发代码(ASCII码)y1。
if(x1>=0x40) y1=x1-0x40;
else y1=x1;
send_7bit(y1); //把7位收发代码y1送入发送数据区。
}
Else
{ //x1最高位为1,x1、x2转换为收发代码(汉字码) y1、y2。
x2=sendData[i]; //x2取机内码。
i++;
AA=x1&0x7f; //x1、x2最高位清0,成14位汉字码AA,BB。
BB=x2&0x7f;
AB14_to_ab13();//将14位汉字码AA,BB转换为汉字13位码a,b。
y1=a|0x40;//汉字13位码添上最高位1,成14位收发代码y1、y2。
y2=b;
send_7bit(y1); //把y1、y2两个7位收发代码送入发送数据区。
send_7bit(y2);
}
} //循环直至(sn)个。
}
/*-----------------------------------------------------
** 函数名:yToX_receive
** 功能: 消息6或消息8当 DAC为413且FI为01时,接收含中文信息的收发代码时调用。将接收的收发代码转换为机内码,送入数组receiveData。汉字13位码转换为机内码的汉字代码时,调用函数ab13_to_AB14()。
** 输入:rn,接收数据区7位收发代码总数;
函数receive_7bit(),从接收数据区取7位收发代码。
** 输出:数组receiveData。
-------------------------------------------------------
void yToX_receive(rn)
unsigned char rn;
{
unsigned char i,x1,x2,y1,y2;
i=0;
while(i<rn) //循环直至(rn)个。
{ //7位收发代码y1 或y1、y2转换为机内码。
y1=receive_7bit()&0x7f; //y1从接收数据区取7位收发代码。
if(y1<0x40)
{ //y1第7位为0,y1转换为机内码(ASCII码) x1。
if(y1<0x20) x1=y1+0x40;
else x1=y1;
receiveData[i]=x1; //机内码x1送入数组receiveData。
i++;
}
else
{ //y1第7位为1,y1、y2转换为机内码(汉字码) x1、x2。
y2=receive_7bit()&0x7f; //y2从接收数据区取7位收发代码。
a=y1&0x3f; //y1第7位清0,y1、y2成汉字13位码a,b。
b=y2;
ab13_to_AB14();//将汉字13位码a,b转换为14位汉字码AA、BB。
x1=AA|0x80; //AA、BB最高位置1,成机内码(汉字码)x1、x2。
x2=BB|0x80;
receiveData[i]=x1; //机内码x1、x2送入数组receiveData。
i++;
receiveData[i]=x2;
i++;
}
}//循环直至(rn)个。
}
/*-------------------------------------------------
** 函数名:AB14_to_ab13
** 功能:将14位汉字码AA,BB转换为13位汉字码a,b。
** 输入:AA,14位汉字码第一字节,低7位有效;
BB,14位汉字码第二字节,低7位有效。
** 输出:a,13位汉字码第一字节,低6位有效;
b,13位汉字码第二字节,低7位有效;
-------------------------------------------------*/
void AB14_to_ab13()
{
if(AA<0x40)
{
b=BB/0x20; //(BB/0x20)的商
a=(AA-0x30)*4+b;
b=BB%0x20; //(BB/0x20)的余数
}
else
{
a=AA-0x40;
b=BB;
}
}
/*-------------------------------------------------
** 函数名:ab13_to_AB14
** 功能:将13位汉字码a,b转换为14位汉字码AA,BB。
** 输入:a,13位汉字码第一字节,低6位有效;
b,13位汉字码第二字节,低7位有效;
** 输出:AA,14位汉字码第一字节,低7位有效;
BB,14位汉字码第二字节,低7位有效。
-------------------------------------------------*/
void ab13_to_AB14()
{
if(b<0x20)
{
AA=0x30+a/4;
BB=b+(a&3)*0x20;
}
else
{
AA=a+0x40;
BB=b;
}
}
来源:中华人民共和国海事局
电话:025-85511250 / 85511260 / 85511275
传真:025-85567816
邮箱:89655699@qq.com