dポイントプレゼントキャンペーン実施中!

プログラム初心者です。
写真等のファイルをバイナリデータで読み込んで暗号化の変換して出力したいと思っています。
ECBモードとかCBCモードのように
配列16バイト単位で暗号化の関数は作ったのですがどう読み込んで処理していいかわかりません。

#include <stdio.h>
#include <stdlib.h>
#include"test1.h"

int main(){
int i,j;
FILE* fp1,*fp2;
unsigned char yomikomi[16]= {0}; //16バイト読み込み用(関数用でファイルから読み込む際に 
                    使用していた)
unsigned char key[16]= {0};
unsigned char syuturyoku[16]= {0}; //関数からの出力
unsigned char ioutput[16];
unsigned char buff[?][?]; // ファイルから読み込む16バイト分を格納する配列?

fp1 = fopen( "syasin.jpg", "rb" );
if( fp1 == NULL ){
printf( "ファイルオープンに失敗しました。\n" );
exit( 1 );
}
fread( test, sizeof(char), sizeof(test), fp1 );
}
fclose(fp1);

 fp2 = fopen( "kekka", "wb" );
if( fp1 == NULL ){
printf( "ファイルオープンに失敗しました。\n" );
exit( 1 );
}
ファイルサイズ分読み込んで
for(i=0;i<  ;i++){
 kannsuu(yomikomi,key,syuturyoku);
 }
16バイトずつ読み込んで関数に入れて値を返す
 もしくは関数から出たものとまた処理を加えて繰り返す。
 
 最後に結合してファイルに出力したいです。
 その他疑問点:足りない場合はパディング?処理をしないと処理できない?
 ご教授よろしくお願いします。

A 回答 (2件)

forループを無限ループ(while(1)などでも可)にしてループ内部を以下のようにしてみては?


・fread()による16バイトデータ読み込み(※戻り値の読み込みデータ数を確認。データが無ければ終了)
・暗号化関数の呼び出し
・fwrite()による16バイトデータ書き込み

最後に読み込み、書き込みファイルのクローズ処理を。
先の回答者の指摘にあるように、16の倍数で無い場合を考慮する処理が必要でしょう。fread()の戻り値を利用して工夫しましょう。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
〉※戻り値の読み込みデータ数を確認。
はfreadの中で判定するということですかね?
イメージはつきました。がんばります。

お礼日時:2021/02/05 12:09

メモリが足りるなら全部一度に読み込んだ方が簡単になるような気もしないでもないけど, 「16バイトごとに処理する」なら原理的には「16バイトずつ読み込めばいい」だけの話... じゃないのかなぁ. どういう処理をするのか知らんけど.



で一般には「ファイルサイズが 16 の倍数になる」とは限らないので, 16 の倍数でないときにどうするかは考えないとダメだね. あと
fread( test, sizeof(char), sizeof(test), fp1 );
の test ってなに?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
16バイトずつ読み込む
確かにそうですね。
読み書きについて全般的に勉強不足で本やネット見てもなかなか理解できないので質問させていただきました。
いろんなプログラムを組み合わせてあれこれしています。
testは関数を16バイトで読み込んでいた配列でした。ここでyomikomiの部分です。

お礼日時:2021/02/05 12:04

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