NonSoft

バイナリデータをテキスト形式に変換するサンプル(VC6)


 サンプル(ソース/コード)
<このサンプルの概要>
バイナリデータのテキスト形式での表現方法
<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);
//-------------------------------------------------------------------