お使いのマシンchar
は署名されているようです。したがって、に負の数をキャストするとunsigned int
、大きな値が得られます。を使用してそれらを表す場合、出力の大きな値は負の値ですchar
。に署名さchar
れている場合、その値はtoである可能性がありますが、バイトはtoの間にある可能性があることに注意してください。したがって、より大きい値は範囲間で負になります。-128
127
0
255
127
-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
つまり、最初ににキャストchar
しunsigned char
、次ににキャストしunsigned int
ます。
さて、それはあなたが直面している問題についてのすべてです。次に、スタイルとイディオムに関するメモをいくつか示します。new
C ++では、できるだけ使用を避ける必要があります。あなたの場合、あなたは次のように使うことができます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
も使用しません。