06

29

C言語プログラミング演習 解答1-3

2010.06.29(21:50)

私の解答例もあげておきます。

Base64.cpp (前半)


/********************************************************************
概要 : Base64エンコーディング
関数 : size_t Base64Encode(const unsigned char* in, size_t inLen, unsigned char* out, size_t outLen)
引数 : in : 入力データの先頭ポインタ
inLen : 入力データサイズ
out : 出力バッファの先頭ポインタ
outLen : 出力バッファサイズ
戻り値 : 出力バッファに書き込んだデータサイズ
作成日 : 2010/06/29
*********************************************************************/

#include "Base64.h"

#define NULL ((void*)0)

static const char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

/*
* Base64エンコーディング
* 3オクテット(8ビット*3=24ビット)のバイナリコードをASCII文字のうちの
* 65文字([A-Za-z0-9+/]の64文字とパディングのための'=')だけを使用して
* 4オクテット(6ビット*4=24ビット)の印字可能文字列に変換する
*/
size_t Base64Encode(const unsigned char* in, size_t inLen, unsigned char* out, size_t outLen) //★10
{
unsigned int ac24 = 0;
size_t writtenLen = 0;
/* 入力文字数を 3で割った端数を求める。端数は0,1,2のいずれか */
size_t remainLen = inLen % 3;
size_t i = 0;

/* 入力文字列、入力文字列長さ、出力バッファ、出力バッファサイズの確認 */
if (in == NULL || inLen == 0 || out == NULL || outLen == 0) {
return 0; //★20
}
/* 出力バッファサイズが十分か調べる */
if ((inLen / 3 + 1) * 4 + 1 > outLen) {
return 0;
}
/* 3文字ずつ処理する */
for (i = 0; i < inLen / 3; i++) {
ac24 = *in++;
ac24 <<= 8;
ac24 |= *in++;
ac24 <<= 8;
ac24 |= *in++;
*out++ = table[(ac24 >> 18) & 0x3f];   //★30
*out++ = table[(ac24 >> 12) & 0x3f];
*out++ = table[(ac24 >> 6) & 0x3f];
*out++ = table[(ac24) & 0x3f];
writtenLen += 4;
}
/* 端数が1文字の場合 */
if (remainLen == 1) {
ac24 = *in++;
ac24 <<= 16;
*out++ = table[(ac24 >> 18) & 0x3f];
*out++ = table[(ac24 >> 12) & 0x3f];
*out++ = '=';
*out++ = '=';
writtenLen += 4;
}
/* 端数が2文字の場合 */
else if (remainLen == 2) {
ac24 = *in++;
ac24 <<= 8;
ac24 |= *in++;
ac24 <<= 8;
*out++ = table[(ac24 >> 18) & 0x3f];
*out++ = table[(ac24 >> 12) & 0x3f];
*out++ = table[(ac24 >> 6) & 0x3f];
*out++ = '=';
writtenLen += 4;
}
*out = '\0';
return writtenLen;
}



コメント
★10
引数の名前が、inとinLen、outとoutLenになっていて、前者が後者の部分文字列になっている。

★20
事前条件が不成立の場合はただちにreturn しており、出口が1つという原則に反している。
がこのほうが読みやすい。

★30
定数値がマクロ定義したものではなく直接値で書かれている。
がこのほうが読みやすい。

コメントの投稿

非公開コメント

プロフィール

島敏博

Shima Toshihiro 島敏博
信州アルプスハイランド在住。HaskellとElixirが好き。組み込みソフトウェアアーキテクト、C++プログラマ、山歩き、美術館巡り、和食食べ歩き、日本赤十字社救急法指導員、インデックス投資、クラシック音楽、SESSAME会員、状態マシン設計、モデル駆動開発、ソフトウェアプロダクトライン、Rubyist、実践ビジネス英語

■ ツイッター
http://twitter.com/saltheads
■ Facebook
http://www.facebook.com/saltheads
■ Qiita
http://qiita.com/saltheads

印刷する場合は、ブラウザの印刷メニューではなく、このページの上から3cmくらいの青いところにある、「印刷」を押してみてください。少しうまく印刷できます。まだ完全ではないのですが、これで勘弁してください。


カテゴリ
最新記事
月別アーカイブ
最新コメント
検索フォーム
リンク
sessame
RSSリンクの表示