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件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
Encode関数内でstrlenを使われていますが、バイナリファイルを読み込んだ場合、0('\0')も立派なデータとなります。
よって、strlenでファイルの大きさを求めることは出来ません。
これが途中で切れてしまう原因と思われます。
あとは、右シフトの問題だと思います。
charは符号付の型なので、右シフトは算術シフトになっていると思われます。
No.1
- 回答日時:
ぱっと見
・for の範囲がおかしい
・char の右シフトがあやしい
の 2点はある.
char ch = '\x9f';
printf("%d\n", ch >> 1);
の結果が (char を 8ビットと仮定して) どうなるかわかりますか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C++初心者です stirng 2 2022/09/20 20:43
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CStringをwchar_tに変換したい
-
ネットワークにつながっている...
-
文字列から空白を取り除きたい...
-
配列をnビットシフトする
-
バイナリファイルをコピーする...
-
iconv_open失敗
-
100バイトのバイナリファイルを...
-
C言語 バイナリファイルをfloa...
-
C言語です
-
atoi( ) の反対をやりたい
-
VC++でコンパイルエラーが出ま...
-
2曲同時再生するにはどうした...
-
char型の扱える範囲とは?
-
'const char *' 型は 'char *' ...
-
main の引数には const 付けた方が
-
引数の渡し方と受け方(argv)
-
ひとつのプログラムにしたいの...
-
c#でbmp画像の上下反転
-
c言語の問題の説明、各所ごとに
-
_TCHAR*での引数の読み込み
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【至急】C言語の問題です、どな...
-
charからLPTSTRへの変換方法
-
charでの計算?
-
配列をnビットシフトする
-
fgetsなどのときのstdinのバッ...
-
絶対パスからのファイル名の切...
-
文字列から空白を取り除きたい...
-
C言語のfor文です。 繰り返しの...
-
テキストデータをそのままバイ...
-
CStringをwchar_tに変換したい
-
switch文で文字を比較すること...
-
C言語の入力した文字を反転させ...
-
atoi( ) の反対をやりたい
-
double型の値をchar配列に変換...
-
C言語 ミリ秒を日付に変換には
-
'const char *' 型は 'char *' ...
-
文字列がNULLか空文字列かの判定
-
c++ 文字列を入力して、一文字...
-
型変換
-
干支のプログラム
おすすめ情報