TTCN-3 编码解码相关模块引入2

本文探讨了网络数据传输中编码解码的问题,特别是在处理非整字节数量数据时的挑战。通过具体示例介绍了如何在TTCN-3环境下处理hexstring类型的编解码过程,包括奇数位数据的特殊处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天继续探讨编码解码相关的问题。


在编解码例子一中提到了系统例子中提供的 binary_string.c,binary_string.h 两个操作二进制串的文件,看过代码的童鞋会发现,实现是使用一个char数组来保存数据的,也就是说,每次存入提取都需要以8比特为单位。

在网络数据传输中一般是保证整字节的,但是网络协议的定义往往对每一比特位都“物尽其用”,因此在编解码的过程中往往会出现添加不是整字节单位数据的情况。

考虑下面代码,使用到TTCN-3中hexstring的类型

module Codec_B {

	//1.端口定义 
    type port common_port message {
		inout all
	} 
	
	//2.成分定义
	type component MyMTC{
	   port common_port mtc_port;
	   } 

	type component MySUT{
	   port common_port sut_port;
	   } 
	
	// 定义测试例
	testcase Basic_TC () runs on MyMTC system MySUT
	{
		mtc_port.clear;
		
		//不能操作sut_port,这个端口在SUT,并不在MTC的控制下
		//sut_port.clear;

		map(mtc:mtc_port, system:sut_port);

		mtc_port.start;
		//不能操作sut_port,这个端口在SUT,并不在MTC的控制下
		//sut_port.start;

		mtc_port.send('ABCD'H);
					
		mtc_port.receive('ABCD'H);

		mtc_port.send('ABC'H);
					
		mtc_port.receive('ABC0'H);
		setverdict(pass);
		stop;
	
	}

	//控制部分
	control {
		execute(Basic_TC());
	}
}

编码函数中,碰到hexstring我们需要做出如下处理:

1,碰到偶数情况与octetstring处理方式相同

2,如果是奇数情况,需要额外多申请一个字节,该字节的高4位是数据、低4位用0填充;同时记录数据位数,继续编码时从低4位开始


在binary_string.c 中添加处理半字节的方法

/* Appends half byte to the end of binary string
 * It's assumed that binary string has enough free space
 */
static void append_half_byte (MyBinaryString *string, unsigned char data)
{
  unsigned long free_pos;

  free_pos = string->string.bits/8;
  string->string.data[free_pos] = data;
  string->string.bits += 4;
}


在tci_codec.c中添加hexstring编码函数

//对hexstring类型的数据进行编码
void encode_hexstring(MyBinaryString *msg, String str)
{
	unsigned char * binstr;
	unsigned char binvalue;
	unsigned long len;
	int i,k;

	printf("\n In function encode_hexstring() \n");
	
	//输入的字符串中含有前后双引号和H,将它们去掉
	len = str?strlen(str):0;
	for(i=0;i<len-3;i++){
		str[i]=str[i+1];
	}	
	str[i]='\0';
	len=strlen(str);//the new length

	if(len%2==0){//偶数的话与处理octetstring相同
		binstr =(unsigned char *)malloc(len);
		char2hex_encode(msg,str,binstr);
		binary_string_append_bytes(msg, binstr, len/2);
	}else{
		//基数的话先处理前面的偶数个字符
		binstr =(unsigned char *)malloc(len);
		//先把最后一个字符保存起来
		binvalue = str[i-1];
		str[i-1] = '\0';
		char2hex_encode(msg,str,binstr);
		
		binary_string_append_bytes(msg, binstr, len/2);

		//处理最后一个字节,不够的用0填充
		len += 1;
		if(((binvalue-'0')>=0)&&((binvalue-'9')<=0)) {
			binvalue = (binvalue-'0')*16;
		} else if(((binvalue-'A')>=0)&&((binvalue-'F')<=0)) {
			binvalue = (binvalue-'A'+10)*16;
		} else if(((binvalue-'a')>=0)&&((binvalue-'f')<=0)) {
			binvalue = (binvalue-'a'+10)*16;
		} else {
			tci_assert(0, "Wrong hex string: the value should be between 0~9, a~f");
		}
		binary_string_append_char(msg,binvalue);
	}

	printf("\n Leave function encode_hexstring() \n");
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值