ReflectIn

実装し忘れていたZIPの暗号化をやっています。
鍵の更新処理にCRC-32が使われているのですが、その初期化でハマリました。
Boost.CRCでの概要はこうです。

template < std::size_t Bits, impl_def TruncPoly = 0u,
           impl_def InitRem = 0u,
           impl_def FinalXor = 0u, bool ReflectIn = false,
           bool ReflectRem = false >
    class crc_optimal;

typedef crc_optimal<32, 0x04C11DB7, 0xFFFFFFFF, 0xFFFFFFFF, true, true>
  crc_32_type;

ZIPの仕様書によると、初期値は305419896(=0x12345678)と878082192(=0x34567890)なので、単純に、

boost::crc_32_type key0(0x12345678);
boost::crc_32_type key2(0x34567890);

とすればよいように思えます。
ところがReflectIn=trueの場合、初期値もビット逆転しなくてはいけません。
また、FinalXorもいらないので、

typedef boost::crc_optimal<32,0x04C11DB7,0,0,true,true> crc_type;
crc_type key0(0x1E6A2C48);
crc_type key2(0x091E6A2C);

となります。
逆転すると、シークエンスが崩れるのがなんか嫌です。
ちなみに、TruncPolyもビット逆転した値です。