如何将二进制文件转换为另一个二进制表示,如图像

我想要一个二进制文件(exe,msi,dll,无论如何),并能够实际“看到”二进制代码或我想要的任何基础(hex)。 想到最简单的方法就是将代码输出到txt中,这样我就可以检查它了。

什么是最好最简单的方法呢? 基本上我希望将二进制代码转换为我的项目的图片。

同样,如果我可以获取一些二进制代码,然后将其转换为二进制文件,那将是很好的。

你有什么方法可以做到这一点,我列出了C,C ++和C#,因为它们似乎是最快的编程语言,我认为这可能需要一些时间。 我想我对C中的答案更感兴趣,但我主要是在寻找这背后的一些逻辑。

这是将字节打包成图像的一种方法……有趣的是,如果您记录原始文件长度并使用无损图像格式,您可以安全地在以后提取二进制数据。

打包为ARGB ……

var exefile = Directory.GetFiles(".", "*.exe").First(); var fi = new FileInfo(exefile); var dimension = (int)Math.Sqrt((fi.Length + 1d) / 4); using (var bitmap = new Bitmap(dimension, dimension + 2)) { //store the file length in the first pixel. bitmap.SetPixel(0, 0, Color.FromArgb((int)fi.Length)); var buffer = new byte[fi.Length + 4 - fi.Length % 4]; Array.Copy(File.ReadAllBytes(exefile), buffer, fi.Length); int x = 1, y = 0; for (var offset = 0; offset < buffer.Length; offset += 4) { var colorValue = BitConverter.ToInt32(buffer, offset); bitmap.SetPixel(x, y, Color.FromArgb(colorValue)); x++; if (x >= dimension) { x = 0; y++; } } bitmap.Save(Path.ChangeExtension(exefile, ".png"), ImageFormat.Png); } 

打包为黑白二进制……

 var width = (int)Math.Sqrt(fi.Length * 8); width = width + 8 - (width % 8); var length = (int)(fi.Length * 8 / width); Func getcolor = (b, m) => (b & m) == m ? Color.Black : Color.White; using (var bitmap = new Bitmap(width, length + 1)) { var buffer = File.ReadAllBytes(exefile); int x = 0, y = 0; foreach (var @byte in buffer) { bitmap.SetPixel(x + 0, y, getcolor(@byte, 0x80)); bitmap.SetPixel(x + 1, y, getcolor(@byte, 0x40)); bitmap.SetPixel(x + 2, y, getcolor(@byte, 0x20)); bitmap.SetPixel(x + 3, y, getcolor(@byte, 0x10)); bitmap.SetPixel(x + 4, y, getcolor(@byte, 0x8)); bitmap.SetPixel(x + 5, y, getcolor(@byte, 0x4)); bitmap.SetPixel(x + 6, y, getcolor(@byte, 0x2)); bitmap.SetPixel(x + 7, y, getcolor(@byte, 0x1)); x += 8; if (x >= width) { x = 0; y++; } } bitmap.Save(Path.ChangeExtension(exefile, ".tif"), ImageFormat.Tiff); } 

……是的,它看起来像是噪音

我不太确定你要做什么,但听起来有点像你正在寻找一个hex编辑器 。

您可以通过调用静态方法ReadAllBytes来读取C#或任何.NET语言中文件的所有字节。

 byte[] allBytes = File.ReadAllBytes("YourPath"); 

它会将所有字节放入一个数组中。

如果你想将它转换为HexaDecimal,请看这里 。

已经为你完成了! 非常方便的二进制文件已经存储在二进制文件中!

刚刚提出你的问题,我在讨论中遇到了一些问题,但想知道它是多么容易实现。 这是一个最小的实现,它为您提供当前正在执行的程序集的二进制输出(即您当前运行的EXE):

 byte[] bytes = File.ReadAllBytes(Assembly.GetExecutingAssembly().Location); // this can get large, we know how large, so allocate early and try to be correct // note: a newline is two bytes StringBuilder sb = new StringBuilder(bytes.Length * 3 + (bytes.Length / 16) * 4); for (int i = 0; i < bytes.Length; i++) { sb.AppendFormat("{0:X2} ", bytes[i]); if (i % 8 == 0 && i % 16 != 0) sb.Append(" "); if (i % 16 == 0) sb.Append("\n"); } 

如果输出StringBuilder内容,则会看到以下几个字节的以下内容(这是我的测试可执行文件):

 5A 90 00 03 00 00 00 04 00 00 00 FF FF 00 00 B8 
 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 00 
 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
 00 00 00 00 00 00 00 00 00 00 00 80 00 00 00 0E 
 1F BA 0E 00 B4 09 CD 21 B8 01 4C CD 21 54 68 69 
 73 20 70 72 6F 67 72 61 6D 20 63 61 6E 6E 6F 74 
 20 62 65 20 72 75 6E 20 69 6E 20 44 4F 53 20 6D 
 6F 64 65 2E 0D 0D 0A 24 00 00 00 00 00 00 00 50 

这是在C中打印出1和0的字节的代码:

 #include  void putbits(unsigned char byte) { unsigned char mask = 0x01; for (int bit = 7; bit >= 0; bit--) { if ((mask << bit) & byte) { printf("1"); } else { printf("0"); } } // Uncomment the following line to get each byte on it's own line. //printf("\n"); } int main (int argc, const char * argv[]) { int c; while ((c = getchar()) != EOF) { putbits(c); } return 0; } 

您可以在命令行上构建和运行它,如下所示:

 gcc main.c --std=c99 -o printer ./printer < printer > printer.txt 

然后它会将它的1和0输出到printer.txt。