2012-01-25 14 views
4

符号なしlong long intをベクトルに変換する方法を教えてください。C++:符号なしlong long intをベクトル<char>に変換し、逆も同様です。

ベクターへのunsigned long long int型から変換するために、私は次のことを試みた:

unsigned long long int x; 
vector<char> buf(sizeof(x)); 
memcpy(&buf[0], &x, sizeof(x)); 

Iは、x = 1234567890のために試験したとき、それが失敗しました。私は符号なしlong long intにベクトルを変換するために、それが動作する... X(たとえば1-100)の値が小さいため

それをしようとしたときしかし、私が使用:

unsigned long long int = (unsigned long long int)buf[0]; 

誰がどのように教えてもらえますそれをするために。

+0

はい、私は私がクライアントからサーバにそれを送信し、それを読み取ることができるように、ベクターに整数を分割しようとしています。 – veda

+0

これを行うには、Mark Bのソリューションをベクトル関数に安全に書き込んだり、読み込んだりすることができます。 – Benj

答えて

7

バイトをコピーすることは、クロスプラットフォームのポータブルではないことを覚えておいてください。あなたのmemcpyはうまく見えるので、途中でそれを再作成しないのはなぜですか?あなたが書いたのは、単にベクトルの最初のバイトをとり、unsigned long longに変換します。なぜそれが小数に対して機能するのかを説明しています。

バックベクトルのうち値を取得する代わりに、これを試してみてください:

unsigned long long int x; 
memcpy(&x, &buf[0], sizeof(x)); 
+2

Hehe、ビッグエンディアンシステムで彼の現在のアプローチを試した場合、buf [0]には本当に大きなxの値があれば何も含まれません。 – Benj

3

あなたはあなたの最後の行を変更する必要があります。

memcpy(&buf[0], reinterpret_cast<char*>(&x), sizeof(x)); 

編集私はナンセンスを話していた、その行はそれが道罰金ですが、コンバージョンが戻って悪いです - あなたが値を変換し、代わりにポインタ:

unsigned long long int val = *reinterpret_cast<unsigned long long int*>(&buf[0]); 
+0

@マークB:私もそれを理解しました - そこにはちょっと混乱しました。 –

4

代わりのmemcpyあなたがコピーを実行するためにstd::vector::assignを使用することができベクターに直接INGの。

#include <iostream> 
#include <vector> 

int main() 
{ 
    unsigned long long int x = 0x0807060504030201; 
    std::vector<char> v; 

    v.assign(reinterpret_cast<char *>(&x), reinterpret_cast<char *>(&x) + sizeof(x)); 

    for(auto i = v.begin(); i != v.end(); ++i) { 
    std::cout << std::hex << static_cast<int>(*i) << ' '; 
    } 
    std::cout << std::endl; 

    // To convert back 
    auto y = *reinterpret_cast<unsigned long long int *>(&v[0]); 
    std::cout << "y = " << std::hex << std::showbase << y << std::endl; 

    return 0; 
} 

出力:

1 2 3 4 5 6 7 8 
y = 0x807060504030201 
+0

これを逆の順序で保存する方法は、印刷の出力が8 7 6 5 4 3 2 1になることを意味しますか? – rank1

+1

@ cygi1989 ['std :: reverse'](http://en.cppreference.com/w/cpp/algorithm/reverse)を使用してください。 'v.assign(...);' add 'std :: reverse(v.begin()、v.end());' – Praetorian

+0

の後に。可能な限り小さなベクトルを割り当てることは可能ですか、与えられた整数を格納するのに必要なバイト数を返す関数があるとしましょう。どうすればいい? – rank1

関連する問題