16進定数テーブルを変換するにはsedを使用しますか?

16進定数テーブルを変換するにはsedを使用しますか?

大きな定数テーブルを含むC ++ソースファイルがあります。彼らはSボックスで、次のようになります。これ:

const word64 T[8][256] =
{
    {
        0xa832a829d77f9aa8, 0x4352432297d41143, 0x5f3e5fc2df80615f, 0x061e063014121806,
        0x6bda6b7f670cb16b, 0x75bc758f2356c975, 0x6cc16c477519ad6c, 0x592059f2cb927959,
        0x71a871af3b4ad971, 0xdf84dfb6f8275bdf, 0x87a1874c35b22687, 0x95fb95dc59cc6e95,
        ...
    }
}

次のように、Cマクロで各18文字の定数をラップする必要があります。

W64LIT(0xa832a829d77f9aa8), W64LIT(0x4352432297d41143), W64LIT(0x5f3e5fc2df80615f), W64LIT(0x061e063014121806)

sedが解決策の一部であることはわかっていますが、「16ビット16進部分の一致」に問題があります。

マクロで各64ビット16進値をどのようにラップできますかW64LIT


大きな変化の理由は、PowerMacの古いAppleコンパイラによるものです。ストリームを生成します。

g++ -DNDEBUG -g2 -O3 -fPIC -pipe -c kalyna.cpp
kalyna.cpp:432: error: integer constant is too large for 'long' type
kalyna.cpp:509: error: integer constant is too large for 'long' type
kalyna.cpp:608: error: integer constant is too large for 'long' type
kalyna.cpp:713: error: integer constant is too large for 'long' type
...

ULLただし、以前のMicrosoftコンパイラではこれを処理できなかったため、単に追加することはできません。したがって、マクロはオペレーティングシステム間の平和を維持します。

ベストアンサー1

これは私にとって効果的です。

sed 's/0x[0-9a-f]\{16\}/W64LIT(&)/g'

これには、「0x」という接頭辞が付いた16個の16進数(小文字のみ)シーケンスが含まれます。

おすすめ記事