我最近查看了一个配置文件,里面保存了一些晦涩的值。我碰巧有源代码可用,所以就看了看它在做什么,结果是将许多不同的值和位移操作融合到了一起。这让我感到困惑为什么有人会这样做。我的问题是:采用这种方式存储数字数据是否有明显的优势?我可以看出来,这可能使得存储的值在字节方面稍微更小,但似乎要花费大量工作才能节省几个字节的存储空间。而且,它似乎会显著地变慢。
另一个可能性是它被用于混淆目的。位移操作常用于混淆吗?
我最近查看了一个配置文件,里面保存了一些晦涩的值。我碰巧有源代码可用,所以就看了看它在做什么,结果是将许多不同的值和位移操作融合到了一起。这让我感到困惑为什么有人会这样做。我的问题是:采用这种方式存储数字数据是否有明显的优势?我可以看出来,这可能使得存储的值在字节方面稍微更小,但似乎要花费大量工作才能节省几个字节的存储空间。而且,它似乎会显著地变慢。
另一个可能性是它被用于混淆目的。位移操作常用于混淆吗?
这是位移的常见用法之一。具有以下几个优点:
1)位移操作速度快。
2)您可以在单个值中存储多个标志。
如果您有一个应用程序具有多个功能,但您只想启用某些(可配置的)功能,则可以执行以下操作:
[Flags]
public enum Features
{
Profile = 1,
Messaging = 1 << 1,
Signing = 1 << 2,
Advanced = 1 << 3
}
启用消息和高级功能的单个值为:
(1 << 1) + (1 << 3) = 2 + 16 = 18
<add name="EnabledFeatures" value="18" />
然后,要确定给定的功能是否启用,只需执行一些简单的位运算:
var AdvancedEnabled =
EnabledFeatures & Features.Advanced == Features.Advanced;
if (available_hours[0] != 0)
可以判断你在周日(或周一,如果你喜欢的话)是否有空。 - cHao
configParam = true
变成了cnfgaa reofiPrm=tr
。现在对于单个参数来说,它可能看起来足够混淆,以至于不能立即找出正确的值。但是对于整个文件来说,这种模式就非常明显了。唯一的问题是,它不仅仅是一个配置文件,还是一个许可证文件... 嗯哼... 我想他们认为只使用纯文本并强制执行哈希签名太复杂了... - corsiKafunc SizeVarint(x uint64) int { switch { case x < 1<<7: return 1 case x < 1<<14: return 2 case x < 1<<21: return 3 case x < 1<<28: return 4 case x < 1<<35: return 5 case x < 1<<42: return 6 case x < 1<<49: return 7 case x < 1<<56: return 8 case x < 1<<63: return 9 } return 10 }
- lokanadham100