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/

时间: 2024-08-22 15:22:23

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

python模块之email: 电子邮件编码解码 (一、解码邮件)

python模块之email: 电子邮件编码解码 (一.解码邮件) python自带的email模块是个很有意思的东西,它可以对邮件编码解码,用来处理邮件非常好用. 处理邮件是一个很细致的工作,尤其是解码邮件,因为它的格式变化太多了,下面先看看一个邮件的源文件: Received: from 192.168.208.56 ( 192.168.208.56 [192.168.208.56] ) by ajax-webmail-wmsvr37 (Coremail) ; Thu, 12 Apr 200

《Python核心编程(第3版)》——2.7 相关模块

2.7 相关模块 表2-4列出了其他一些与网络和套接字编程有关的Python模块.当开发低级套接字程序时,经常配合使用select模块和socket模块.select模块提供了select()函数,该函数管理套接字对象集合.它所做的最有用的一个事情就是接收一套套接字,并监听它们活动的连接.select()函数将会阻塞,直到至少有一个套接字已经为通信做好准备,而当其发生时,它将提供一组准备好读信息的集合(它还可以确定哪些套接字准备好写入,虽然它不像前一种操作那么常见). 在创建服务器方面,asyn

Python base64编码解码实例

  这篇文章主要介绍了Python base64编码解码实例,本文直接给出实例代码,使用也很简单,需要的朋友可以参考下 Python中进行Base64编码和解码要用base64模块,代码示例: ? 1 2 3 4 5 6 7 #-*- coding: utf-8 -*- import base64   str = 'cnblogs' str64 = base64.b64encode(str) print str64 #Y25ibG9ncw== print base64.b64decode(str

Java字符编码解码的实现详解_java

 字符集基础: Character set(字符集)          字符的集合,也就是,带有特殊语义的符号.字母"A"是一个字符."%"也是一个字符.没有内在数字价值,与 ASC II ,Unicode,甚至是电脑也没有任何的直接联系.在电脑产生前的很长一段时间内,符号就已经存在了. Coded character set(编码字符集)          一个数值赋给一个字符的集合.把代码赋值给字符,这样它们就可以用特定的字符编码集表达数字的结果.其他的编码字符

node.js学习之base64编码解码_node.js

一. Base64编码由来 为什么会有Base64编码呢?因为有些网络传送渠道并不支持所有的字节,例如传统的邮件只支持可见字符的传送,像ASCII码的控制字符就 不能通过邮件传送.这样用途就受到了很大的限制,比如图片二进制流的每个字节不可能全部是可见字符,所以就传送不了.最好的方法就是在不改变传统协议的情 况下,做一种扩展方案来支持二进制文件的传送.把不可打印的字符也能用可打印字符来表示,问题就解决了.Base64编码应运而生,Base64就是一种 基于64个可打印字符来表示二进制数据的表示方法

Quoted-printable 编码介绍、Quoted-printable编码解码转换方法_其它综合

Quoted-printable 可译为"可打印字符引用编码"."使用可打印字符的编码",我们收邮件,查看信件原始信息,经常会看到这种类型的编码! 最多时候,我们在邮件头里面能够看到这样的编码!Content-Transfer-Encoding:quoted-printable 它是多用途互联网邮件扩展(MIME) 一种实现方式.其中MIME是一个互联网标准,它扩展了电子邮件标准,致力于使其能够支持非ASCII字符.二进制格式附件等多种格式的邮件消息.目前http协

PHP也能干大事之PHP中的编码解码详解

PHP也能干大事之PHP中的编码解码详解        这篇文章主要介绍了PHP也能干大事之PHP中的编码解码详解,本文讲解了ASCII编解码.URL编解码.Base64编解码.HTML实体编解码.二进制.八进制.十进制.十六进制相互转换等内容,需要的朋友可以参考下 写在前面 PHP也能干大事是我总结的PHP语法特性及相关函数类库的经典用法,并不一定是真正能实现四两拨千斤的功效,但是掌握这些方法,可以在你的工作和学习上有一些帮助,希望大家能集思广益,将<PHP也能干大事>丰富得更精彩!转载请注

Base64在线编码解码实现代码 演示与下载

在线演示地址:gb2312版本 http://tools.jb51.net/tools/base64_decode-gb2312.phputf8版本 http://tools.jb51.net/tools/base64_decode-utf8.php复制代码 代码如下:<?php header('Content-Type: text/html; charset=gb2312'); $txt1 = stripslashes(trim( @$_POST['text1'])); $button = @

MIME和BASE64编码/解码程序代码

首先我要在这里向各位纠正我犯在一个错误:Base64 只是MIME的一种编码方案,我原来所说的 MIME 其实是MIME的另一种编码方案 -- Quoted-Printable ,所以我对本文作了一些修正,并对由此而给大家带来的误导表示歉意. May.6-01 最近在研究 POP3 时碰到一个问题,即其中的中文都是经过 MIME 编码了的,如 MS Outlook Express 是用 Base64 ,而 FoxMail 则用的是QP ,本来想找几个现成的编码/解码的代码,结果只在 UDDF 中