2016-04-02 13 views
0

unsigned intに32ビットの値を入れたいと思っています。私はこのプログラムを、32ビットと64ビットの整数で、小さなエンディアンと大きなエンディアンの両方で実行するplatfromsで実行します。ここで私は、これは大きなendnianとし、32ビットおよび64ビットの整数型で動作するようになると思い、私のコード32ビットからunit64への変換をC++で

void uCHarToInt(unsigned char* input, unsigned int* oputput) 
    { 
     memcpy(oputput, reinterpret_cast<unsigned int*>(&input), 4); 

     if (sizeof(unsigned int) == 8) 
     { 
      *oputput >>= 32; 
     } 
    } 

ですが、私はリトルエンディアンについて確認していないとどのようにmemcpyのは、異なるプラットフォーム上で動作しますありません。より良い解決策はありませんか?

+3

はなぜだと思いますワードサイズまたは受信側ホストのエンディアンに関係なく、正しく変換を行いますあなたはここに再解釈する必要がありますか?あなたが望む正確なサイズを持つことが保証されている 'uint32_t'をなぜ使いませんか? –

+0

私はいくつかの古いコードを再利用し、IDはこのキャストを使用するために私に助言を与える..と私は、符号なしのintsを返す関数を持っていますが、それを変更する方が良いようです...これはすべてのプラットフォームで動作しますはい? void uCHarToInt(unsigned char * input、uint32_t * oputput) { \t memcpy(oputput、input、4); } –

+3

コードについては忘れてください。あなたが達成しようとしていることについて何の言及もなしに、達成したいことを説明してください。明らかに、コードは奇妙なことです。 – gnasher729

答えて

2

もっと良い解決策はありますか?

確かにあります。

それはあなたが与えられているバイトシーケンスがリトルエンディアンまたはビッグエンディアン(私は彼らが通信プロトコルの一部として到着したと仮定しています?)

次のような機能があるかどうかを質問から明らかではありません

#include <iostream> 
#include <iomanip> 
#include <iterator> 
#include <algorithm> 

template<class Iter> 
unsigned int accumulate_value(Iter first, Iter last) 
{ 
    unsigned int result = 0; 
    for(; first != last ; ++first) 
    { 
     result <<= 8; 
     result |= *first; 
    } 
    return result; 

} 

unsigned int from_big_endian_stream(const unsigned char* bytes, size_t size = 4) 
{ 
    return accumulate_value(bytes, bytes + size); 
} 

unsigned int from_little_endian_stream(const unsigned char* bytes, 
             size_t size = 4) 
{ 
    return accumulate_value(std::make_reverse_iterator(bytes+4), 
          std::make_reverse_iterator(bytes)); 
} 

int main() 
{ 
    unsigned char little_endian_data[] = { 3, 0, 2, 0 }; 
    unsigned char big_endian_data[] = { 0, 2, 0, 3 }; 

    std::cout << std::hex << from_little_endian_stream(little_endian_data) 
    << std::endl; 

    std::cout << std::hex << from_big_endian_stream(big_endian_data) 
    << std::endl; 

} 

期待される結果:

20003 
20003 
関連する問題