プロが教える店舗&オフィスのセキュリティ対策術

C++で第1引数に指定したファイルを読み込んでBase64でテキストへ変換してコンソールに表示するプログラムをつくりました。しかし結果が途中で途切れてしまったり、変な文字が交端に表示されます。どこが悪いのか教えてください。

ーーーーーーーーーーーーーーーーーーーーーーーーーー

#include <windows.h>
#include <iostream>
#include <fstream>

char* Encode(const char *szStr, int iLens)
{
const char *szB64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
char *lpszOutputString;// 結果出力先
int iLen;

int i,j;

if(iLens == -1)
iLen = strlen(szStr);
else
iLen = iLens;

lpszOutputString =
new char[(int)((double)(iLen)*1.5)+10];
for(i = 0,j = 0; i < (iLen - (iLen % 3)); i+=3)
{
lpszOutputString[j] = szB64[(szStr[i] & 0xfc) >> 2];
lpszOutputString[j+1] = szB64[((szStr[i] &0x03) << 4) |
((szStr[i+1] & 0xf0) >> 4)];
lpszOutputString[j+2] = szB64[((szStr[i+1] & 0x0f) <<2 ) |
((szStr[i+2] & 0xc0) >> 6)];
lpszOutputString[j+3] = szB64[(szStr[i+2] & 0x3f)];
j += 4;
}
i = iLen-(iLen % 3);// 残りのサイズを計算
switch(iLen % 3)
{
case 2:// 1文字分パディングが必要
{
lpszOutputString[j] = szB64[(szStr[i] & 0xfc) >> 2];
lpszOutputString[j+1] = szB64[((szStr[i] &0x03) << 4) |
((szStr[i+1] & 0xf0) >> 4)];
lpszOutputString[j+2] = szB64[((szStr[i+1] & 0x0f) <<2 )];
lpszOutputString[j+3] = szB64[64];// Pad
lpszOutputString[j+4] = '\0';
}
break;
case 1:// 2文字分パディングが必要
{
lpszOutputString[j] = szB64[(szStr[i] & 0xfc) >> 2];
lpszOutputString[j+1] = szB64[((szStr[i] &0x03) << 4)];
lpszOutputString[j+2] = szB64[64];// Pad
lpszOutputString[j+3] = szB64[64];// Pad
lpszOutputString[j+4] = '\0';
}
break;
}
lpszOutputString[j+4] = '\0';

return lpszOutputString;
}


int main(int argc,char *argv[]){

std::ifstream fp(argv[1], std::ios::in|std::ios::binary);
std::fstream::pos_type begp, endp;
fp.seekg(0, std::ios_base::end);
endp = fp.tellg();
fp.seekg(0, std::ios_base::beg);
begp = fp.tellg();
int fsize;
fsize = (int)(endp - begp);

char* buff = new char[fsize+1];
std::cout << "ファイルサイズ:" << fsize << std::endl;
fp.read(buff,fsize);
buff[fsize] = '\0';

std::cout <<Encode(buff, -1) << std::endl;

return 0;
}

A 回答 (2件)

Encode関数内でstrlenを使われていますが、バイナリファイルを読み込んだ場合、0('\0')も立派なデータとなります。


よって、strlenでファイルの大きさを求めることは出来ません。
これが途中で切れてしまう原因と思われます。
あとは、右シフトの問題だと思います。
charは符号付の型なので、右シフトは算術シフトになっていると思われます。
    • good
    • 0

ぱっと見


・for の範囲がおかしい
・char の右シフトがあやしい
の 2点はある.
char ch = '\x9f';
printf("%d\n", ch >> 1);
の結果が (char を 8ビットと仮定して) どうなるかわかりますか?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!