【发布时间】:2016-10-27 19:02:08
【问题描述】:
所以基本上我正在编写一个在二进制文件中查找 PNG 文件的应用程序。它通过将文件中的整个二进制文件读入字节数组,然后使用 Convert.ToBase64String 方法将其转换为字符串,然后使用匹配 PNG 的标头信息和结束块的正则表达式来查找图像。问题是使用 ToBase64String 方法会根据字节数组的长度生成截然不同的输出,而 MSDN 上的文档似乎没有详细说明。无论如何,这是我的意思的一个例子。
byte[] somebytes = new byte[] { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
Console.WriteLine(Convert.ToBase64String(somebytes));
如果我跳过一个字节,现在这种情况下的输出是“AQIDBAUGBwg=”...
byte[] somebytes = new byte[] { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
somebytes = somebytes.Skip(1).ToArray();
Console.WriteLine(Convert.ToBase64String(somebytes));
现在的输出是“AgMEBQYHCA==”,所以几乎每个字符都与上一个示例相比发生了变化。
那么,我是在此处对二进制文件进行正则表达式的错误路径无可救药地走错了路,还是有一种方法(可能通过填充?)我可以保证这些转换的一致性?
更新: 根据我收集到的反馈,我似乎应该离开正则表达式解决方案,自己手动搜索开始和结束字节序列。不知道为什么我被否决了,因为我只是想了解为什么我的其他解决方案确实有效,而且似乎没有关于这个主题的任何其他帖子。无论如何,感谢大家的快速反馈。完成后我会发布用于查找图像的算法,以防它可能对其他人有益。
【问题讨论】:
-
是的,你是。做base64然后试图找到标题是没有意义的。为什么不直接在二进制文件中查找?或者,如果您必须使用十六进制来保持一致性
-
"它通过将文件中的整个二进制文件读入字节数组,然后使用 Convert.ToBase64String 方法将其转换为字符串,然后使用匹配 PNG 标头的正则表达式来完成此操作信息和结束块以查找图像。” 什么...?你有一个字节数组,所以搜索字节数组。
-
至于为什么会改变,是因为你在移动数组。 Base64 一次占用 6 位并转换为一个字符。如果你移动一个字节(8 位),那么你将得到完全不同的字符。
-
@Thermonuclear 这是一个糟糕的主意,尤其是,如果您想添加对其他文件格式的支持。只需在字节数组中搜索适当的格式签名即可。
-
删除的答案是正确的。您需要检查图像的字节,而不是将其转换为其他内容并尝试以其他方式解析它。
标签: c# regex binaryfiles