航网

资讯

关于印发自动识别系统中文编码规则的通知


关于印发自动识别系统中文编码规则的通知,

关于印发自动识别系统中文编码规则的通知

海船舶﹝2011﹞543号  2011年8月24日

各有关单位:

为充分发挥国内航行船舶船载自动识别系统(AIS)设备的航海安全保障作用,统一AIS中文信息的收发方式,我局组织制定了AIS中文编码规则,现予印发,请遵照执行。

各AIS设备生产厂家要在设备安装上船前设定中文编码规则。对已安装上船的AIS设备,各生产厂家要及时组织对其设备进行升级,最迟不晚于2012年7月1日前完成。

自动识别系统中文编码规则

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