从文件中读取二进制数据,将值显示为十六进制,然后保存的可靠方法是什么?
What is a reliable way to read binary data from a file, display the values as hex, and then save it?
我想读取一个二进制文件(比如 notepad.exe),并为文件中存储的每个二进制值显示一个 2 个字符的十六进制值。 (一个富文本框就足够了)
在不做任何更改的情况下,我希望将十六进制转换回来,并将其保存到一个新文件(仅用于演示),比如 - notepad2.exe ,让它工作!
我发现的问题是有很多方法可以打开数据流来读取文件的内容,但是似乎没有任何方法可以获取原始数据(存储在磁盘上)数据不再转换为某些文本格式,如 Unicode 等
下载文件时,字节是一种易于管理的方式,我可以轻松地将其转换为十六进制并显示,但我无法找到某种形式的 'readallbytes' 来处理已存储在驱动器上的文件可以可靠地做到这一点。 (这很可能是为什么大多数十六进制编辑器显示正确,但在打开文件并保存时不做任何更改时就破坏了文件)。
读取文件的所有原始字节、将这些字节转换为十六进制以供显示、然后将显示的十六进制转换回并保存回文件的可靠方法是什么。
(我知道 SO 上关于二进制与十六进制相互转换的文章,这些文章适用于您使用该方法创建的文件。到目前为止,它们在处理现有文件(exe、dll 等)时被证明是不可靠的. 它们看起来像工作,也就是说,你可以获得十六进制值,但它们是错误的,因为在转换中丢失了某些东西,最终破坏了你保存回磁盘的文件。
这里是一些示例代码,它将导致 notepad.exe
的非功能性副本为 notepad2.exe
// view hex
byte[] data = File.ReadAllBytes( Path.Combine(Environment.GetFolderPath( Environment.SpecialFolder.Windows ), "notepad.exe"));
richTextBox1.Text = Regex.Replace( BitConverter.ToString( data ).Replace( '-', ' ' ), "(.{"+72+"})", ""+"\n" );
// save hex back to file
data = richTextBox1.Text.Replace( "\n", "" ).Split( ' ' ).Select( b => Convert.ToByte( b, 16 ) ).ToArray();
File.WriteAllBytes("notepad2.exe", data);
更奇怪的是,副本没有运行,但 FC 显示这个:
即使是 Microsoft File Checksum Integrity Verifier 也表明他们是匹配的
...但它不会执行! (双击它似乎没有任何作用 - 此演示的预期结果是打开记事本!)
我会让你添加所有的错误处理。
string ReadFileAsHexString(string filename)
{
var bytes = File.ReadAllBytes(filename);
return bytes.Aggregate(new StringBuilder(),
(sb, v) => sb.AppendFormat("{0:X2} ", v))
.ToString();
}
void WriteHexStringAsBinaryToFile(string hex, string filename)
{
var bytes = hex.Split(new [] {' '}, StringSplitOptions.RemoveEmptyEntries)
.Select(s => Convert.ToByte(s, 16))
.ToArray();
File.WriteAllBytes(filename, bytes);
}
我想读取一个二进制文件(比如 notepad.exe),并为文件中存储的每个二进制值显示一个 2 个字符的十六进制值。 (一个富文本框就足够了)
在不做任何更改的情况下,我希望将十六进制转换回来,并将其保存到一个新文件(仅用于演示),比如 - notepad2.exe ,让它工作!
我发现的问题是有很多方法可以打开数据流来读取文件的内容,但是似乎没有任何方法可以获取原始数据(存储在磁盘上)数据不再转换为某些文本格式,如 Unicode 等
下载文件时,字节是一种易于管理的方式,我可以轻松地将其转换为十六进制并显示,但我无法找到某种形式的 'readallbytes' 来处理已存储在驱动器上的文件可以可靠地做到这一点。 (这很可能是为什么大多数十六进制编辑器显示正确,但在打开文件并保存时不做任何更改时就破坏了文件)。
读取文件的所有原始字节、将这些字节转换为十六进制以供显示、然后将显示的十六进制转换回并保存回文件的可靠方法是什么。
(我知道 SO 上关于二进制与十六进制相互转换的文章,这些文章适用于您使用该方法创建的文件。到目前为止,它们在处理现有文件(exe、dll 等)时被证明是不可靠的. 它们看起来像工作,也就是说,你可以获得十六进制值,但它们是错误的,因为在转换中丢失了某些东西,最终破坏了你保存回磁盘的文件。
这里是一些示例代码,它将导致 notepad.exe
的非功能性副本为 notepad2.exe
// view hex
byte[] data = File.ReadAllBytes( Path.Combine(Environment.GetFolderPath( Environment.SpecialFolder.Windows ), "notepad.exe"));
richTextBox1.Text = Regex.Replace( BitConverter.ToString( data ).Replace( '-', ' ' ), "(.{"+72+"})", ""+"\n" );
// save hex back to file
data = richTextBox1.Text.Replace( "\n", "" ).Split( ' ' ).Select( b => Convert.ToByte( b, 16 ) ).ToArray();
File.WriteAllBytes("notepad2.exe", data);
更奇怪的是,副本没有运行,但 FC 显示这个:
即使是 Microsoft File Checksum Integrity Verifier 也表明他们是匹配的
...但它不会执行! (双击它似乎没有任何作用 - 此演示的预期结果是打开记事本!)
我会让你添加所有的错误处理。
string ReadFileAsHexString(string filename)
{
var bytes = File.ReadAllBytes(filename);
return bytes.Aggregate(new StringBuilder(),
(sb, v) => sb.AppendFormat("{0:X2} ", v))
.ToString();
}
void WriteHexStringAsBinaryToFile(string hex, string filename)
{
var bytes = hex.Split(new [] {' '}, StringSplitOptions.RemoveEmptyEntries)
.Select(s => Convert.ToByte(s, 16))
.ToArray();
File.WriteAllBytes(filename, bytes);
}