3

Windows で一部のソース コードを 1 つのスクリプト言語 (PAWN) からプログラミング言語 (C++) に変換しています。

ソースコードには、次の形式で何百万ものバイナリリテラルがあります。

data[] = 
{
    0b11111111111011111110110111111110, 0b00000000001111111111111111111111,
    0b00000000000000000000000000000000, 0b00000000000000000000000000000000,
    0b00000000000000000000000000000000, 0b00000000000000000000000000000000,
    0b00000000000000000000000000000000, 0b00000000000000000000000000000000,
    ///some million lines later...
    0b00000000000000000000000000000000, 0b11111111111111111111111110000000,
    0b11100001001111111111111111111111, 0b11110111111111111111111111111111,
    0b11111111111111111111111111111111, 0b11111111111111111111111111111111,

残念ながら、Visual Studio 2013 はユーザー定義リテラル標準をサポートしていません。

どういうわけかこれを達成する方法はありますか?010101_b か C++ で何か、おそらくブーストを少し追加して?

4

2 に答える 2

1

スクリプトを使用してソース コードを変換することを強くお勧めします。

とにかく、Boost.PP に興味がある場合:

#define FROM_BINARY(s, data, elem) sum(#elem+2)

constexpr auto sum(char const* str, std::uintmax_t val = 0) -> decltype(val)
{
    return !*str? val : sum(str+1, (val << 1) + *str - '0');
}

unsigned data[]
{
    BOOST_PP_TUPLE_REM_CTOR(BOOST_PP_SEQ_TO_TUPLE(
        BOOST_PP_SEQ_TRANSFORM(FROM_BINARY, , 
            BOOST_PP_VARIADIC_TO_SEQ(
    0b11111111111011111110110111111110, 0b00000000001111111111111111111111,
    0b00000000000000000000000000000000, 0b00000000000000000000000000000000,
    0b00000000000000000000000000000000, 0b00000000000000000000000000000000,
    0b00000000000000000000000000000000, 0b00000000000000000000000000000000,
    ///some million lines later...
    0b00000000000000000000000000000000, 0b11111111111111111111111110000000,
    0b11100001001111111111111111111111, 0b11110111111111111111111111111111,
    0b11111111111111111111111111111111, 0b11111111111111111111111111111111))))
};

これにより、コンパイル時間が恐ろしく遅くなる可能性があることに注意してください。そのため、代わりにソース dode を一度変換してみてください。

于 2014-11-22T17:00:58.453 に答える
0

2 進リテラルを 16 進リテラルに変換する単純で小さなコンソール プログラムを作成することをお勧めします。

私が使用するプロセスは次のとおりです。

  1. ファイルをコピーします。
  2. テキスト エディターを使用して、最初のリテラルの前にあるものをすべて削除します。
  3. 最後のリテラルの後のすべてを削除します。
  4. 保存。
  5. 「,」を改行に置き換えます。
  6. 保存。

これで、バイナリ リテラルを 1 行に 1 つずつ含むテキスト ファイルが作成されました。

ファイルを読み込み、16 進数リテラルに変換して出力するプログラムを作成します。

次に、不足しているすべてのものを貼り付けて、このファイルを編集します。

于 2014-11-22T17:02:48.107 に答える