1

これは私の質問です。.jpgファイルを開き、各バイトをコンマで区切った10進数(0〜255)として別の.txtファイルに書き込みたいと思います。これで、そのtxtファイルを使用して.jpfファイルを再度ビルドできるようになります。これが私がやろうとした方法です。

#include<iostream>
#include<fstream>
using namespace std;
int main()
{
long x;
char *s;

ifstream ifs("image.jpg",ios::binary);
ifs.seekg(0,ios::end);
x=ifs.tellg();
ifs.seekg(0,ios::beg);

s=new char[x];
ifs.read(s,x);
ifs.close();

ofstream is("image.txt");

for(int i=0;i<x;i++){
is<<(unsigned int)s[i]<<",";
}

現在、このプログラムは次のように10進数でimage.txtを作成します。4294967295,4294967256,4294967295,4294967264,0,16,74,70,73,70,0,1、......ここでいくつかの数値は4バイトのようです長い間、s [i]は1バイトしか参照しないので、(int)s[i]は255より大きい数値をどのように返すことができますか。誰かがこれについて私を助けてくれますか....ありがとう..

4

1 に答える 1

13

お使いのマシンchar署名されているようです。したがって、に負の数をキャストするとunsigned int、大きな値が得られます。を使用してそれらを表す場合、出力の大きな値は負の値ですcharに署名さcharれている場合、その値はtoである可能性がありますが、バイトはtoの間にある可能性があることに注意してください。したがって、より大きい値は範囲間で負になります。-1281270255127-128 to -1

用途unsigned char

unsigned char *s;

またはこれを行います:

is<< static_cast<unsigned int> (static_cast<unsigned char>(s[i]) )<<",";
                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                                casting to unsigned char first
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
               then casting to unsigned int 

つまり、最初ににキャストcharunsigned char、次ににキャストしunsigned intます。


さて、それはあなたが直面している問題についてのすべてです。次に、スタイルとイディオムに関するメモをいくつか示します。newC ++では、できるだけ使用を避ける必要があります。あなたの場合、あなたは次のように使うことができますstd::vector

//define file stream object, and open the file
std::ifstream file("image.jpg",ios::binary);

//prepare iterator pairs to iterate the file content!
std::istream_iterator<unsigned char> begin(file), end;

//reading the file content using the iterator!
std::vector<unsigned char> buffer(begin,end);

最後の行は、ファイルからすべてのデータをに読み込みますbuffer。これで、次のように印刷できます。

std::copy(buffer.begin(), 
          buffer.end(), 
          std::ostream_iterator<unsigned int>(std::cout, ","));

これらすべてを機能させるには、コードにすでに追加したものに加えて、次のヘッダーを含める必要があります。

#include <vector>     //for vector
#include <iterator>   //for std::istream_iterator and std::ostream_iterator
#include <algorithm>  //for std::copy

ご覧のとおり、この慣用的なソリューションはポインターを使用せず、キャストnewも使用しません。

于 2012-07-11T14:56:53.920 に答える