画像をバイナリとして開いたのちにそのバイナリ列と16進文字列を相互変換するプログラムを書いています。ここで問題なのが、バイナリ列から16進文字列への変換をしたのち、再びバイナリ列に戻してファイルに書き出すとサイズが半分になってしまいます。どこがおかしいのかわからなくなってしまったためアドバイスをお願いしたいです。参考にしたサイトはこちらです。
ソースを掲載いたします。第一引数からファイル名を読み、そのファイルと同じものをoutputという名前で書き出します。
C++
1#include <stdio.h> 2#include <fstream> 3#include <sstream> 4#include <iostream> 5#include <string> 6#include <string.h> 7#include <iterator> 8 9using namespace std; 10 11 12void BytesFromHexString(const char* str) { 13 int len = (int)strlen(str); 14 std::cout << len << std::endl; 15 unsigned char data[len / 2]; 16 17 ofstream wf; 18 wf.open("output", ios::trunc); 19 20 for (int i = 0; i < len; i+=2) { 21 unsigned int x; 22 sscanf((char *)(str + i), "%02x", &x); 23 data[i/2] = x; 24 wf << data[i/2]; 25 } 26 27} 28 29 30int main( int argc, char *argv[] ) 31{ 32 33 std::ifstream ifs(argv[1], std::ios::binary); 34 if (ifs.fail()) 35 { 36 std::cerr << "失敗" << std::endl; 37 return -1; 38 } 39 40 std::string str((std::istreambuf_iterator<char>(ifs)), 41 std::istreambuf_iterator<char>()); 42 43 std::string destination; 44 for(int i = 0; i < (int)str.size(); ++i){ 45 char buffer[2]; 46 snprintf(buffer, sizeof(buffer), "%02x", (unsigned char)str[i]); 47 destination = destination + buffer; 48 49 } 50 51 BytesFromHexString((const char*) destination.c_str()); 52 53 return 0; 54}
回答3件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。