2017-02-21 12 views
0

のstd :: vectorを作成する必要がある関数の中で、の値fooが返されます。 ベクトルのサイズは必要以上に大きくならないようにしてください。つまり、foo > 255の場合は、ベクトルのサイズは2になる可能性があります。foo > 0xFFの場合、ベクトルのサイズは3になります。foo > 0xFFFFFFの場合、ベクトルのサイズは4でなければなりません。 ベクトルの正しいサイズはint fooのサイズに依存し、ベクトルのintpush_backの正しいバイトにアクセスします。 ご協力いただければ幸いです!ありがとう!整数値の1バイトを符号なし文字のベクトルにコピー

これは私がこれまで持っているものです。

size_t foo2= foo; 
    size_t bytes = 0; 
    while (foo2!= 0) 
    { 
     foo2/= (1u << CHAR_BIT); 
     bytes++; 
    } 
    std::vector<unsigned char> myVec(bytes); 

    for (size_t i = 0; i < bytes; i++) 
     myVec[bytes-1-i]=(*((char*)&foo+ i)); 
+0

時には、コード例がよりよく通信します... – WhiZTiM

+0

特定のエンディアン要件はありますか?下位バイトから始まり、 'push_back'を使って、例えば、あなたのベクトルをリトルエンディアンにします。 – Useless

答えて

3

それは単純でないのはなぜ?

size_t foo2 = foo; 

std::vector<unsigned char> myVec; 
myVec.clear(); 

//special case if myVec should not be empty for foo = 0 
if(foo2 == 0){ 
    myVec.push_back(0); 
} 

while(foo2 > 0){ 
    unsigned char current_part = (unsigned char) (foo2 % 256); 
    myVec.push_back(current_part); 
    foo2 /= 256; 
} 

次に、目的のエンディアンに応じて逆にすることもできます。 (の#include <アルゴリズム> STDは(myVec.begin()、myVec.end())逆::;)

(私のコードは、FOO> = 0は、ところで、人はそれをキャッチしたいか、やるかもしれないことを前提としていアサート)

+0

'foo2%255 ... foo2/= 255'数値の小数点以下の表現を計算するとき、9で割りますか? –

+0

@ n.m。ああ、時々私はいくつかの愚かな間違いをする。ありがとう、それを変更しました。 – Aziuth

+0

'(unsigned char)foo2'は既に0-255の範囲であり、'%256'を使うために何も追加しません。 –

関連する問題