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

简介:
 在编解码例子一中提到了系统例子中提供的 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");
}


最新内容请见作者的GitHub页:http://qaseven.github.io/

相关文章
|
机器学习/深度学习 算法 Python
使用Python实现深度学习模型:元学习与模型无关优化(MAML)
使用Python实现深度学习模型:元学习与模型无关优化(MAML)
756 0
使用Python实现深度学习模型:元学习与模型无关优化(MAML)
|
10月前
|
Java
smartupload文件上传!
使用 `smartupload.jar` 实现文件上传和下载。首先将 `smartupload.jar` 添加到项目中,然后创建上传页面,确保表单使用 `POST` 方法并设置 `enctype=&quot;multipart/form-data&quot;`。接着在服务器端通过 `SmartUpload` 对象处理文件上传,保存文件到指定目录,并获取表单中的其他数据。最后,实现文件下载功能,设置响应头以触发浏览器下载文件。
179 0
|
缓存 关系型数据库 MySQL
在Linux中,如何优化MySQL性能,包括索引优化和查询分析?
在Linux中,如何优化MySQL性能,包括索引优化和查询分析?
|
缓存 JSON JavaScript
深入理解RESTful API设计原则与最佳实践
- REST是一种基于HTTP的Web服务设计风格,强调资源、统一接口和无状态性。 - 设计原则:统一接口(资源标识、操作、自描述消息、无状态),资源中心,标准方法,分层系统和缓存。 - 最佳实践:版本控制、JSON格式、有意义的状态码、HATEOAS和安全性(HTTPS,认证,授权)。 - 示例:使用Node.js和Express实现用户管理API,包括GET、POST、PUT和DELETE操作,展示资源操作的基本实现。 代码示例展示了如何创建、读取、更新和删除用户资源,以及处理HTTP状态码和错误情况。实际应用时,需进一步完善安全和性能优化。
1930 0
|
存储 机器学习/深度学习 算法
如何准确的估计llm推理和微调的内存消耗
最近发布的三个大型语言模型——Command-R+ (104B参数), Mixtral-8x22b (141B参数的MoE模型), 和 Llama 3 70b (70.6B参数)——需要巨大的内存资源。推理时,Command-R+需193.72GB GPU RAM,Mixtral-8x22B需262.63GB,Llama 370b需131.5GB。激活的内存消耗根据序列长度、批大小等因素变化。文章详细介绍了计算这些模型内存需求的方法,并探讨了如何通过量化、优化器优化和梯度检查点减少内存使用,以适应微调和推理。
1886 0
|
机器学习/深度学习 人工智能 运维
自动化运维:提升效率与减少错误的未来之路
【6月更文挑战第16天】在IT行业快速发展的今天,自动化运维已成为企业追求高效、稳定运营的关键策略。本文将探讨自动化运维的重要性,分析其在提升工作效率和减少人为错误方面的显著优势,并展望自动化技术如何塑造未来的运维模式。
127 0
|
存储
两种增量AD数据同步实现方案比较
## 背景 业务对接AD过程中,当应用程序在某个时刻点对AD中的数据进行全量同步后,我们还需要时不时的去拉取AD在后续时刻中变更过的数据,保持应用程序和AD中数据的一致性。本文对两种实现AD增量数据同步的方法进行了一个对比和分析总结,以供参考。 ## 方法一:DirSync Control方式 AD技术方案介绍文档:《[Polling for Changes Using the DirSync C
1007 0
两种增量AD数据同步实现方案比较
|
SQL 存储 分布式计算
大数据技术基础实验九:Hive实验——部署Hive
大数据技术基础实验九,了解有关Hive的知识和学习如何在虚拟机上部署Hive并启动Hive。
648 0
大数据技术基础实验九:Hive实验——部署Hive
|
存储 缓存 JavaScript
Vue本地存储及用法
Vue本地存储及用法
258 0
BXA
|
消息中间件 缓存 NoSQL
深入理解Spring Boot核心原理
Spring Boot是一个用于构建基于Spring框架的独立应用程序的框架。它采用了自动配置的原则,以减少开发人员在搭建应用架构方面的时间和精力,同时提升了系统的可维护性和可扩展性
BXA
6276 0