5

少し問題があります。基本的に、ホワイトリストに登録されたエントリの大規模なリストをプログラム内に保存する必要があり、そのようなリストを直接含めたいと思います。他のライブラリなどを配布する必要はなく、配布したくないのです。ストリングをWin32リソースに埋め込みます。これは、今は入りたくない理由がたくさんあるためです。

大きなホワイトリストを.cppファイルに含めただけで、次のエラーが発生しました。

1>ServicesWhitelist.cpp(2807): fatal error C1091: compiler limit: string exceeds 65535 bytes in length

文字列自体は、VC++で許可されているこの制限の約2倍です。プログラムにそのような大きなリテラルを含めるための最良の方法は何ですか?

編集:

私は次のように文字列を保存しています:

const std::wstring servicesWhitelist
(
 L".NETFRAMEWORK|"
 L"_IOMEGA_ACTIVE_DISK_SERVICE_|"
 L"{6080A529-897E-4629-A488-ABA0C29B635E}|"
 L"{834170A7-AF3B-4D34-A757-E05EB29EE96D}|"
 L"{85CCB53B-23D8-4E73-B1B7-9DDB71827D9B}|"
 L"{95808DC4-FA4A-4C74-92FE-5B863F82066B}|"
 L"{A7447300-8075-4B0D-83F1-3D75C8EBC623}|"
 L"{D31A0762-0CEB-444E-ACFF-B049A1F6FE91}|"
 L"{E2B953A6-195A-44F9-9BA3-3D5F4E32BB55}|"
 L"{EDA5F5D3-9E0F-4F4D-8A13-1D1CF469C9CC}|"
 L"2WIREPCP|"
//About 3800 more lines
);

EDIT2 これは、実行時に次のように使用されます。

static const boost::wregex servicesWhitelistRegex(servicesWhitelist);
std::wstring service;
//code to populate service
if (!boost::regex_match(service, servicesWhitelistRegex))
 //Do something to print service
4

5 に答える 5

9

配列はどうですか?(すべての要素の法的な制限の後にのみコンマを配置します)

const std::wstring servicesWhitelist[] = {
 L".NETFRAMEWORK|",
 L"_IOMEGA_ACTIVE_DISK_SERVICE_|",
 L"{6080A529-897E-4629-A488-ABA0C29B635E}|",
 L"{834170A7-AF3B-4D34-A757-E05EB29EE96D}|",
 L"{85CCB53B-23D8-4E73-B1B7-9DDB71827D9B}|",
 L"{95808DC4-FA4A-4C74-92FE-5B863F82066B}|",
 L"{A7447300-8075-4B0D-83F1-3D75C8EBC623}|",
 L"{D31A0762-0CEB-444E-ACFF-B049A1F6FE91}|",
 L"{E2B953A6-195A-44F9-9BA3-3D5F4E32BB55}|",
 L"{EDA5F5D3-9E0F-4F4D-8A13-1D1CF469C9CC}|",
 L"2WIREPCP|",
...
};

以下のステートメントを使用して、結合された文字列を取得できます。

accumulate(servicesWhitelist, servicesWhitelist+sizeof(servicesWhitelist)/sizeof(servicesWhitelist[0]), "")
于 2010-03-20T05:33:10.237 に答える
5

実際に64k文字を超える文字列を格納する必要があると仮定します(つまり、上記の「それを行わない」ソリューションはすべて適用されません)。

MSVCを幸せにするために、次のように言う代わりに:

const char *foo = "abcd...";

64kを超える文字列を、整数で表される個々の文字に変換できます。

const char foo[] = { 97, 98, 99, 100, ..., 0 };

各文字が同等のASCII文字(97 =='a'など)に変換され、最後にNULターミネータが追加されている場合。

MSVC2010は少なくともこれに満足しています。

于 2011-07-08T21:58:03.137 に答える
2

制限の約2倍しかない場合、明らかな解決策は、そのような文字列を2つ(または3つ)格納することであるように思われます。:)実行時にそれらを読み取るコードは、それを十分に簡単に処理できると確信しています。

編集:何らかの理由で正規表現を使用する必要がありますか?大きな文字列を個々のトークンのリストに分割して、簡単な文字列比較を行うことができますか?

于 2010-03-20T05:15:26.300 に答える
0

私はこれについて信用を主張しません:

https://social.msdn.microsoft.com/Forums/vstudio/en-US/c573db8b-c9cd-43d7-9f89-202ba9417296/fatal-error-c1091

代わりにSTLを使用してください。

コードスニペット

#include <sstream>

std::ostringstream oss;

oss << myString1 << myString2 << myString3 << myString4;

oss.str()はSTLのstd :: stringクラスのインスタンスを返すようになり、oss.str()。c_str()はconstchar*を返すようになりました。

于 2015-04-28T20:46:05.833 に答える
-1

あなたの問題は(Pythonで)次のように取り除くことができます:

whitelist_services = { ".NETFRAMEWORK", "_IOMEGA_ACTIVE_DISK_SERVICE_" }
if service in whitelist_services:
   print service, "is a whitelisted service"

C++への直接変換は次のようになります。

// g++ *.cc -std=c++0x && ./a.out
#include <iostream>
#include <unordered_set>

namespace {
  typedef const wchar_t* str_t;
  // or
  ////typedef std::wstring str_t;
  str_t servicesWhitelist[] = {
    L".NETFRAMEWORK",
    L"_IOMEGA_ACTIVE_DISK_SERVICE_",
  };
  const size_t N = sizeof(servicesWhitelist) / sizeof(*servicesWhitelist);

  // if you need to search for multiple services then a hash table
  // could speed searches up O(1). Otherwise std::find() on the array
  // might be sufficient O(N), or std::binary_search() on sorted array
  // O(log N) 
  const std::unordered_set<str_t> services
    (servicesWhitelist, servicesWhitelist + N);
}

int main() {
  str_t service = L".NETFRAMEWORK";
  if (services.find(service) != services.end())
    std::wcout << service << " is a whitelisted service" << std::endl;
}
于 2010-04-11T20:06:04.583 に答える