src


目次

C/C++

16進数を10進数に変換する

// ------------------------------------------------------------------
//
// Hex2Dec
//
// 16進数を10進数に変換する
//

int Hex2Dec(char c)
{
   switch (c)
   {
   case 'A':
   case 'a':
       return 10;
   case 'B':
   case 'b':
       return 11;
   case 'C':
   case 'c':
       return 12;
   case 'D':
   case 'd':
       return 13;
   case 'E':
   case 'e':
       return 14;
   case 'F':
   case 'f':
       return 15;
   default:
       return (c - 48);
   }
}

Base64エンコード

// ------------------------------------------------------------------
//
// 0xfc = 11111100 マスク用ビットシーケンス
// 0x03 = 00000011
// 0xf0 = 11110000
// 0x0f = 00001111
// 0xc0 = 11000000
// 0x3f = 00111111
// 0x30 = 00110000
// 0x3c = 00111100
//
// ------------------------------------------------------------------
// The Base64 アルファベット

const
char szB64[] =
 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";


// ------------------------------------------------------------------
//
// ToB64()
//
// 機能
// ある文字列を入力とし、それをBase64エンコードに変換する。
// 戻り値は、動的に割り当てられており、呼び出し元が解放しなければ
// ならない。
//
// Base64エンコード
// 24ビットのシーケンスを4文字のエンコードされたシーケンスに変換する。
// 4文字にするには、24ビットのグループを4つの6ビットグループに分ける。
// 各6ビットシーケンスは、Base64アルファベットのインデックスとして解釈
// される。
// データの終わりに達したときにに未処理のビットが24ビットに満たない
// 場合は、「=」文字を使って特殊なエンコードを行う。
// 残りが8ビットならば、2つの文字を生成した後に2つの「=」でデータを
// パディングする。
// 16ビットならば、3つの文字を生成した後に1つの「=」でエンコード出力を
// パディングする。
// 
// 例) 24ビットシーケンスのエンコード
//   ・24ビットシーケンス
//       00110011 00110011 00110011
//   ・4つの6ビットシーケンス化
//       001100 110011 001100 110011
//   ・4つの8ビットシーケンス化
//       00001100 00110011 00001100 00110011
//   ・Base64エンコード
//       L y L y

char * ToB64(char *szStr)
{
 char *szEnc;
 int iLen,
     i,
     j;

 // 文字列をエンコードするための空間確保
 iLen = strlen(szStr);
 szEnc = new char [(int)((float)iLen * 1.5)];

 // 一度に3バイトずつエンコード
 j = 0;
 for (i = 0; i < (iLen - (iLen % 3)); i+=3)
   {
     szEnc[j]   = szB64[ (szStr[i] & 0xfc) >> 2 ];
     szEnc[j+1] = szB64[ ((szStr[i] & 0x03) << 4)   |
                     ((szStr[i+1] & 0xf0) >> 4) ];
     szEnc[j+2] = szB64[ ((szStr[i+1] & 0x0f) << 2) |
                     ((szStr[i+2] & 0xc0) >> 6) ];
     szEnc[j+3] = szB64[ (szStr[i+2] & 0x3f) ];
     j += 4;
   }

 // 残りのサイズ計算
 i = iLen - (iLen % 3);
 switch (iLen % 3)
   {
     // 1文字分のパディングが必要
     case 2:
       {
         szEnc[j] = szB64[ (szStr[i] & 0xfc) >> 2 ];
         szEnc[j+1] = szB64[ ((szStr[i] & 0x03) << 4) | ((szStr[i+1] & 0xf0) >> 4) ];
         szEnc[j+2] = szB64[ (szStr[i+1] & 0x0f) << 2 ];
         szEnc[j+3] = szB64[64];  // Pad
         break;
       }
     // 2文字分のパディングが必要
     case 1:
       {
         szEnc[j] = szB64[ (szStr[i] & 0xfc) >> 2 ];
         szEnc[j+1] = szB64[ (szStr[i] & 0x03) << 4 ];
         szEnc[j+2] = szB64[64];  // Pad
         szEnc[j+3] = szB64[64];  // Pad
         break;
       }
   }
 szEnc[j+4] = NULL;
 return (szEnc);
}

EXCEL


IPヘッダのチェックサムを求める

  1. IP_header_checksum.xlsx