MEMO blog

主に自分用のメモです

【c/c++】バイト列からデータを取り出す

sqliteで、BLOBで格納されているデータを取り出してintやらなんやらに入れるってことをしようとした。

とりあえず、リトルエンディアン前提としてmemcpyを使う

例えばintに取り出す場合

typedef unsigned char uchar;

void getValFromByteList(const uchar* src, uint16_t &dst1, int32_t &dst2)
{
    memcpy( &dst1 , &src[0], sizeof(uint16_t));
    memcpy( &dst2 , &src[2], sizeof(int32_t));

}

いくつかまとめてなら、構造体。

typedef unsigned char uchar;

struct Foo
{
   int x,y,z;
};

void getValFromByteList(const uchar* src, Foo &dst)
{
    memcpy( &dst , &src[0], sizeof(Foo));
}

で、なんとなくtemplate関数にしてみる。

template <typename T>
void getValFromByteList(const unsigned char *src, T &dst, const uint32_t &from = 0)
{
    // たぶん、ここでエンディアンを考慮するような感じにするんだろう
    memcpy(&dst , &src[from], sizeof(T));
}

参考

byte から int への変換 - melpon日記 - HaskellもC++もまともに扱えないへたれのページ