- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试使用以下 XORString 模板/宏在编译时加密字符串文字:
#pragma once
#include <string>
namespace utils {
template <int X> struct EnsureCompileTime {
enum : int {
Value = X
};
};
//Use Compile-Time as seed
#define compile_seed ( (__TIME__[7] - '0') * 1 + (__TIME__[6] - '0') * 10 + \
(__TIME__[4] - '0') * 60 + (__TIME__[3] - '0') * 600 + \
(__TIME__[1] - '0') * 3600 + (__TIME__[0] - '0') * 36000 )
constexpr int LinearCongruentGenerator(int Rounds) {
return 1013904223 + 1664525 * ((Rounds > 0) ? LinearCongruentGenerator(Rounds - 1) : compile_seed & 0xFFFFFFFF);
}
#define Random() EnsureCompileTime<LinearCongruentGenerator(10)>::Value //10 Rounds
#define RandomNumber(Min, Max) (Min + (Random() % (Max - Min + 1)))
template <int... Pack> struct IndexList {};
template <typename IndexList, int Right> struct Append;
template <int... Left, int Right> struct Append<IndexList<Left...>, Right> {
typedef IndexList<Left..., Right> Result;
};
template <int N> struct ConstructIndexList {
typedef typename Append<typename ConstructIndexList<N - 1>::Result, N - 1>::Result Result;
};
template <> struct ConstructIndexList<0> {
typedef IndexList<> Result;
};
template <typename Char, typename IndexList> class XorStringT;
template <typename Char, int... Index> class XorStringT<Char, IndexList<Index...> > {
private:
Char Value[sizeof...(Index)+1];
static const Char XORKEY = static_cast<Char>(RandomNumber(0, 0xFFFF));
template <typename Char>
constexpr Char EncryptCharacterT(const Char Character, int Index) {
return Character ^ (XORKEY + Index);
}
public:
__forceinline constexpr XorStringT(const Char* const String)
: Value{ EncryptCharacterT(String[Index], Index)... } {}
const Char *decrypt() {
for (int t = 0; t < sizeof...(Index); t++) {
Value[t] = Value[t] ^ (XORKEY + t);
}
Value[sizeof...(Index)] = static_cast<Char>(0);
return Value;
}
const Char *get() {
return Value;
}
};
#define XORSTR( String ) ( utils::XorStringT<char, utils::ConstructIndexList<sizeof( String ) - 1>::Result>( String ).decrypt() )
}
代码不是我的,我对c++模板或元编程知之甚少。该代码在小字符串(<250 个字符)上按预期工作,但是,我需要让它在长字符串(数千个字符)上也能工作。
当我在具有数千个字符的字符串文字上使用 XORSTR
宏时,我在编译期间收到“递归类型或函数依赖上下文太复杂”错误。
我已经尝试弄清楚代码到底做了什么,看起来这些行从输入字符串递归地构造了某种编译时数组(?),ConstructIndexList
行是是什么产生了错误:
template <typename IndexList, int Right> struct Append;
template <int... Left, int Right> struct Append<IndexList<Left...>, Right> {
typedef IndexList<Left..., Right> Result;
};
template <int N> struct ConstructIndexList {
typedef typename Append<typename ConstructIndexList<N - 1>::Result, N - 1>::Result Result;
};
由于我对模板知之甚少,所以我不确定如何解决这个问题。
我的一个想法是传递原始文字的宏子字符串,然后将它们连接起来(以程序方式,而不是手动),但是......我不知道如何在上进行编译时子字符串/连接操作文字,也许这是不可能的。
另一个想法是简单地手动拆分我的文字,将拆分后的字符串分别传递给 XORSTR
,然后手动连接结果,但这在我的代码中造成了很多困惑......考虑到我需要对数万个字符运行 XORSTR
,并且当 >~250 个字符传递给它时会弹出错误。
任何其他想法将不胜感激......或者如果有人有另一个编译时字符串混淆实现可以采用任意长度的字符串文字......那就太好了!
最佳答案
如果我没记错的话,你的ConstructIndexList
(大致)制作std::make_integer_sequence
的作品(从 C++14 开始可用)。
所以我想你可以写
template <typename>
struct cilH;
template <int ... Is>
struct cilH<std::integer_sequence<int, Is...>>
{ using type = IndexList<Is...>; };
template <int N>
struct ConstructIndexList
{ using Result = typename cilH<decltype(std::make_integer_sequence<int, N>{})>::type; };
避免递归瓶颈。
(但请记住 #include <utility>
)。
但是,我想,ConstructIndexList
如果使用 std::size_t
类型,则完全可以避免, 而不是 int
, 为你的索引。
我想你的代码可以简化如下
#include <array>
#include <string>
#include <utility>
#include <iostream>
namespace utils
{
constexpr std::size_t compSeed {
(__TIME__[7] - '0') * 1U
+ (__TIME__[6] - '0') * 10U
+ (__TIME__[4] - '0') * 60U
+ (__TIME__[3] - '0') * 600U
+ (__TIME__[1] - '0') * 3600U
+ (__TIME__[0] - '0') * 36000U };
constexpr std::size_t linCongrGen (std::size_t rou)
{ return 1013904223U + 1664525U * ((rou > 0U)
? linCongrGen(rou - 1U)
: compSeed & 0xFFFFFFFFU); }
constexpr std::size_t randNumber (std::size_t mn, std::size_t mx)
{ return mn + (linCongrGen(10U) % (mx - mn + 1U)); }
template <typename, typename>
class XorStringT;
template <typename Char, std::size_t ... Is>
class XorStringT<Char, std::index_sequence<Is...>>
{
private:
Char Value[sizeof...(Is)+1U];
static constexpr Char XORKEY = Char(randNumber(0, 0xFFFF));
public:
constexpr XorStringT (Char const * const String)
: Value{ Char(String[Is] ^ (XORKEY + Is))... }
{ }
constexpr std::array<Char, sizeof...(Is)+1U> decrypt () const
{ return { { Char(Value[Is] ^ (XORKEY + Is)) ..., Char(0) } }; }
Char const * get () const
{ return Value; }
};
}
template <typename T, std::size_t N>
constexpr auto xorStr (T (&s)[N])
{ return utils::XorStringT<T,
decltype(std::make_index_sequence<N - 1U>{})>( s ); }
int main()
{
constexpr auto xst = xorStr("secrettext");
std::cout << xst.get() << std::endl;
std::cout << xst.decrypt().data() << std::endl;
}
关于C++ (异或字符串) : "recursive type or function dependency context too complex",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46349886/
假设a是张量,那么有什么区别: 类型(a) a.类型 a.type() 我找不到区分这些的文档。 最佳答案 type 是 python 内置方法。 它将返回对象的类型。喜欢 torch.Tensor.
什么是 Type 1 的居民的例子?两者都不是 Type也不是Type的居民?在 Idris REPL 中进行探索时,我无法想出任何东西。 更准确地说,我正在寻找一些 x除了 Type产生以下结果:
我找到了一些资源,但我不确定我是否理解。 我找到的一些资源是: http://help.sap.com/saphelp_nw70/helpdata/en/fc/eb2ff3358411d1829f00
这两个函数原型(prototype)有什么区别? void apply1(double(f)(double)); void apply2(double(*f)(double)); 如果目标是将提供的函
http://play.golang.org/p/icQO_bAZNE 我正在练习使用堆进行排序,但是 prog.go:85: type bucket is not an expression
假设有一个泛型定义的方法信息对象,即一个方法信息对象,这样的方法Info.IsGenericMethodDefinition==TRUE:。也可以说它们也有一个泛型参数列表:。我可以使用以下命令获取该
在具有依赖类型的语言中,您可以使用 Type-in-Type 来简化语言并赋予它很多功能。这使得语言在逻辑上不一致,但如果您只对编程感兴趣而不对定理证明感兴趣,这可能不是问题。 在 Cayenne
根据 Nim 手册,变量类型是“静态类型”,而变量在内存中指向的实际值是“动态类型”。 它们怎么可能是不同的类型?我认为将错误的类型分配给变量将是一个错误。 最佳答案 import typetrait
假设您有以下结构和协议(protocol): struct Ticket { var items: [TicketItem] = [] } struct TicketItem { } prot
我正在处理一个 EF 问题,我发现它很难调试...以前,在我的系统中有一个表类型继承设置管理不同的用户类型 - 所有用户共有的一种根类型,以及大致基于使用该帐户的人员类型的几种不同的子类型。现在,我遇
这是我的 DBManager.swift import RealmSwift class DBManager { class func getAllDogs() -> [Dog] {
我正在尝试使用傅里叶校正图像中的曝光。这是我面临的错误 5 padded = np.log(padded + 1) #so we never have log of 0 6 g
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
请考虑以下设置: protocol MyProcotol { } class MyModel: MyProcotol { } enum Result { case success(value:
好吧,我将我的 python 项目编译成一个可执行文件,它在我的电脑上运行,但我将它发送给几个 friend 进行测试,他们都遇到了这个错误。我以前从未见过这样的错误。我使用 Nuitka 来编译代码
当我尝试训练我的模型时"ValueError: Type must be a sub-type of ndarray type"出现在 line x_norm=(np.power(x,2)).sum(
我尝试在另一个类中打断、计数然后加入对象。所以我构建协议(protocol): typealias DataBreaker = () -> [Double] typealias DataJoiner
我正在使用 VS 2015 更新 3、Angular 2.1.2、Typescript 2.0.6 有人可以澄清什么是 typings 与 npm @types 以及本月很难找到的任何其他文档吗? 或
我正在考虑从 VS2010 更改为 Mono,因此我通过 MoMA 运行我的程序集,看看我在转换过程中可能遇到多少困难。在生成的报告中,我发现我不断收到此错误: bool Type.op_Equali
主要问题 不太确定这是否可能,但由于我讨厌 Typescript 并且它使我的编码变得困难,我想我会问只是为了确定。 interface ISomeInterface { handler: ()
我是一名优秀的程序员,十分优秀!