<このサンプルの概要>
バイナリデータのテキスト形式での表現方法
<NUL><SOH><STX><ETX><EOT><ENQ><ACK><LF><CR><NAK><SYN><ETB><ESC>
<00><01><02><10><11><12><a1><A2><a3><f1><F2><f3><Fe><ff>
制御コードの入っているデータを送信する際の入力方法や、送受信ログの表示方法を考え
た時、バイナリデータをそのまま入力、表示する事は難しい。その問題を解決する方法と
してバイナリデータをテキスト形式に変換して入力、表示する方法を実現するため、この
様なプログラムが必要になります。
このプログラムの仕様は単純で、文字として表現出来無い文字コードを発見した時に「バ
イナリデータのテキスト形式での表現方法」に変換する事です。
//-------------------------------------------------------------------
//Bin2Text.cpp
//-------------------------------------------------------------------
#include "Bin2Text.h"
struct STRCTRLCODE{
char code;
char *txtCode;
}ctrlCode[]={
{ASCII_NUL,""},
{ASCII_SOH,""},
{ASCII_STX,""},
{ASCII_ETX,""},
{ASCII_EOT,""},
{ASCII_ENQ,""},
{ASCII_ACK,""},
{ASCII_LF,""},
{ASCII_CR,""},
{ASCII_NAK,""},
{ASCII_SYN,""},
{ASCII_ETB,""},
{ASCII_ESC,""}};
char* Bin2Text(char *txt,const char *bin,int len)
{
int bp;
int tp;
int i;
for( bp = 0, tp = 0 ; bp < len &&
bp < MAX_BUF && tp < MAX_BUF ; ){
// 全角を使用する場合にコメントを外す----
if( IsDBCSLeadByte(bin[bp]) ){
txt[tp++] = bin[bp++];
txt[tp++] = bin[bp++];
continue;
}
//---------------------------------------
for( i = 0 ; i < sizeof(ctrlCode)/sizeof(STRCTRLCODE) ; i++){
if( bin[bp] == ctrlCode[i].code ){
char *mark = ctrlCode[i].txtCode;
if( (MAX_BUF-tp) < (int)strlen(mark) ){
break;
}
strcpy(&txt[tp],mark); tp += strlen(mark);
bp++;
break;
}
}
if( i >= sizeof(ctrlCode)/sizeof(STRCTRLCODE) ){
if( (((int)bin[bp])&0xff) < 0x20 ||(((int)bin[bp])&0xff) > 0x7e ){
char mark[8];
sprintf(mark,"<%02x>",(int)bin[bp]&(int)0x00ff);
strcpy(&txt[tp],mark); tp += strlen(mark);
bp++;
}else{
txt[tp++] = bin[bp++];
}
}
}
txt[tp] = NULL;
return txt;
}
int Text2Bin(char *bin,const char *txt,int size)
{
int bp;
int tp;
int i;
for( bp = 0, tp = 0 ; tp < size &&
bp < MAX_BUF && tp < MAX_BUF ; ){
// 全角を使用する場合にコメントを外す----
if( IsDBCSLeadByte(bin[bp]) ){
bin[bp++] = txt[tp++];
bin[bp++] = txt[tp++];
continue;
}
//---------------------------------------
for( i = 0 ; i < sizeof(ctrlCode)/sizeof(STRCTRLCODE) ; i++){
if( strncmp(&txt[tp],ctrlCode[i].txtCode,
strlen(ctrlCode[i].txtCode)) == 0 ){
bin[bp++] = ctrlCode[i].code;
tp += strlen(ctrlCode[i].txtCode);
break;
}
}
if( i >= sizeof(ctrlCode)/sizeof(STRCTRLCODE) ){
if( txt[tp] == '<' && txt[tp+3] == '>' &&
((txt[tp+1] >= '0' && txt[tp+1] <= '9') ||
(txt[tp+1] >= 'A' && txt[tp+1] <= 'F') ||
(txt[tp+1] >= 'a' && txt[tp+1] <= 'f')) &&
((txt[tp+2] >= '0' && txt[tp+2] <= '9') ||
(txt[tp+2] >= 'A' && txt[tp+2] <= 'F') ||
(txt[tp+2] >= 'a' && txt[tp+2] <= 'f')) ){
sscanf(&txt[tp+1],"%2x",&bin[bp++]);
tp += 4;
}else{
bin[bp++] = txt[tp++];
}
}
}
return bp;
}
//-------------------------------------------------------------------
//Bin2Text.h
//-------------------------------------------------------------------
// 制御コード定義
#define ASCII_NUL 0
#define ASCII_SOH 1
#define ASCII_STX 2
#define ASCII_ETX 3
#define ASCII_EOT 4
#define ASCII_ENQ 5
#define ASCII_ACK 6
#define ASCII_LF 10
#define ASCII_CR 13
#define ASCII_NAK 21
#define ASCII_SYN 22
#define ASCII_ETB 23
#define ASCII_ESC 27
// バッファサイズMAX
#define MAX_BUF 25600
char* Bin2Text(char *txt,const char *bin,int len);
int Text2Bin(char *bin,const char *txt,int size);
//-------------------------------------------------------------------
|
|