Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 标识文件的最少字节数_Algorithm_Search_Hash_Heuristics - Fatal编程技术网

Algorithm 标识文件的最少字节数

Algorithm 标识文件的最少字节数,algorithm,search,hash,heuristics,Algorithm,Search,Hash,Heuristics,我目前正在做一个小项目,这是一个挑战。这是设置:我有一个相当旧的处理器,用于各种各样的产品。对于各种应用程序,大约有500种不同的固件版本。它们有时在几个字节~1k之间存在差异,有时仅共享5%。现在我想通过为每个版本创建一个唯一的标识符来标识它。我有可用的firmeware二进制文件来工作和培训 目标是,当任何设备出现时,我希望读取尽可能少的已安装固件字节,因为连接速度相当慢,为9600波特。尽管固件总共只有大约64k,但完全读取它需要相当长的时间(由于协议开销、时钟速度等原因,大约需要5分钟)

我目前正在做一个小项目,这是一个挑战。这是设置:我有一个相当旧的处理器,用于各种各样的产品。对于各种应用程序,大约有500种不同的固件版本。它们有时在几个字节~1k之间存在差异,有时仅共享5%。现在我想通过为每个版本创建一个唯一的标识符来标识它。我有可用的firmeware二进制文件来工作和培训

目标是,当任何设备出现时,我希望读取尽可能少的已安装固件字节,因为连接速度相当慢,为9600波特。尽管固件总共只有大约64k,但完全读取它需要相当长的时间(由于协议开销、时钟速度等原因,大约需要5分钟)

我在考虑一些逻辑,它将解析存储的固件文件,并确定哪些字节可用于唯一标识它。每当一台设备经过时,它会一个接一个地读取每个指纹字节,就像旧的T9文本预测一样,缩小候选对象的范围,直到找到正确的固件。为此,我需要建立一个包含最优化的指纹字节集的数据库。但是如何训练呢?如何在500个文件中查找最重要的字节

到目前为止,我试图对文件进行统计分析,找出文件之间差异最大的前50个字节。问题是,即使占用50个字节,我也会得到多个创建相同哈希的版本

任何可能解决这个问题的建议或算法都是非常受欢迎的!
如果你有一个完全不同的想法,我很乐意听到

识别值可能不同的所有字节位置。然后找到“最有效的拆分器”,即探测值将拆分最小子集(最小-最大意义上)或更多子集中的当前集的位置

然后对每个子集递归地重复整个过程。这将生成一个决策树,为您提供要测试的字节序列(希望很短)

这是一种启发式方法,可能不是最优的,我希望如此

  • 计算过程不会太长(尽管它将一次性运行)
  • 它离最佳值不远

假设每个拆分都是平衡的,但每次都会产生两个子集,那么测试序列将不会超过10字节。

为什么要进行向下投票?为什么不使用哈希。。。为整个固件创建MD5散列(或任何校验和…),并仅发送该。。。你很可能会发现两个不同的固件具有相同的哈希。。。散列本身只有几个字节长。。。计算速度也应该比你的5分钟快。。。但是你需要计算设备本身的哈希值…@Spektre如果固件不支持这样做,那么在设备上计算哈希值有点困难。如果不可能,那么可能需要更多关于设备的信息来帮助你。。。代码中是否包含一些版本信息?固件(不同的消息)之间的区别是什么?它的内部协议是否改变?发送接收数据包时,它是否有相同的命令。。。所有这些都可以用于检测,而无需实际读取固件。正常的方法是对内容进行散列,如前所述。它可以是您计算的散列,和/或是存储到固件的数据的一部分。对于大多数固件,具有与固件一起存储的预先计算的哈希值,或者至少在固件更新时可用是正常的。哈希通常用于验证任何更新是否成功(即存储的实际上是预期的固件)。感谢您的回复!正如我在文章中提到的,这就是我用50字节所做的。我没有费心把它放到二叉树中,但是因为我已经为每个“路径”创建了一个哈希,所以它归结为同一个东西。即使在值不同的地方使用50个字节,也不足以找到正确的固件。需要进行某种优化,才能根据先前选择的路径减少树中的节点。@Corelgott:不,这不是您所做的。我描述的过程保证了每个版本都会受到歧视。如果幸运的话,10到20个字节就足够了。但它们并不总是在同一个位置。请不要肤浅地阅读。我同意这是最实际的方法。它与构建分类树的ID3算法基本相同。使用“散列”不是一个好方法:系统最终将处理更多(可能远不止)数据,因为它无法使其测试适应到目前为止收集的信息。我知道你要去哪里了。。。我想得越多,就越有可能采用这种方法。我刚刚使用了散列来确保路径的唯一性。但您是对的,对它们进行散列不会使用所需的最小数据集。尽管如此,我的方法最大的不同在于细分,子组在它们自身中得到了优化。我的缺乏这一点,因此我看到了我的问题。我会试试看。。。