【问题标题】:Show binary code of external files/program显示外部文件/程序的二进制代码
【发布时间】:2015-06-26 20:48:07
【问题描述】:

无论如何,所有数字数据都存储在0和1中。我猜这就是二进制数据的原理。

是否有方法或包可以向您显示文件/单个 exe 程序的二进制代码,说明它实际上是如何以 0/1 格式存储的?

我会这样看: - 导入某个随机文件 - 将其转换为 0/1 格式 - 将 1/0 数据存储在 txt (streamwriter/binarywriter) 中

如果是,这是否适用于任何 .NET 语言(首选:c#)?

【问题讨论】:

  • 当您在记事本中打开二进制文件时,您看到的是代表二进制八位字节的字符集。查找一个 ASCII 表来理解我的意思。将该表示转换为实际的 0 和 1 字符有效地将文件大小乘以 8(最佳情况),因为您看到的每个字符现在都是一个表示一个简单位的八位字节。希望您现在了解您在问题中提到的“原则”。

标签: c# .net binary


【解决方案1】:

基本上你只需要把它分成两个步骤:

  1. 将文件转换为字节
  2. 将字节转换为二进制字符串

The first step is easy:

var fileBytes = File.ReadAllBytes(someFileName);

第二步就不那么直接了,but still pretty easy

var byteString = string.Concat(fileBytes.Select(x => Convert.ToString(x, 2).PadLeft(8, '0')))

这里的想法是您单独选择每个字节,将每个字节转换为二进制字符串(向左填充,因此每个字节为 8 个字符,因为许多字节都有前导零),然后将所有这些连接成一个字符串。 (以下部分@xanatos 评论提供。)

【讨论】:

  • 我认为第二行是错误的...string.Concat(fileBytes.Select(x => Convert.ToString(x, 2).PadLeft(8, '0')))
  • @xanatos:可能。我很好奇,我目前正在启动 VS 进行测试:)
  • @xanatos:您确实是正确的,我会更新答案。谢谢!
  • 让它成为一个流,所以如果文件很大,它不会导致内存问题:-)
  • @Fredou:好的,现在它变得很愚蠢:) 你是对的,非常大的文件很容易出现内存问题。 大多数 文件没有那么大。虽然为了公平起见,在这种情况下输入 输出都需要是流,因为从技术上讲,保存一个比文件大 八倍 的字符串不会是对记忆也有好处:)
【解决方案2】:

我认为这是您正在寻找的东西:

byte [] contents = File.ReadAllBytes(filePath);
StringBuilder builder = new StringBuilder();
for(int i = 0; i<contents .Length; i++)
{
  builder.Append( Convert.ToString(contents[i], 2).PadLeft(8, '0') );
}

现在,您可以将 builder 内容写入文本文件。

【讨论】:

【解决方案3】:

这将流式传输转换,如果您有很大的文件,这很有用。

using System;
using System.IO;
using System.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var buffer = new byte[1024];
            int pos = 0; 

            using (var fileIn = new FileStream(@"c:\test.txt", FileMode.Open, FileAccess.Read))
            using (var fileOut = new FileStream(@"c:\test.txt.binary", FileMode.Create, FileAccess.Write))
                while((pos = fileIn.Read(buffer,0,buffer.Length)) > 0)
                    foreach (var value in buffer.Take(pos).Select(x => Convert.ToString(x, 2).PadLeft(8, '0')))
                        fileOut.Write(value.Select(x => (byte)x).ToArray(), 0, 8);
        }
    }
}

【讨论】:

    【解决方案4】:

    您可以以二进制模式打开文件。没有测试它,但它应该可以工作:

    BitArray GetBits(string fuleSrc)
    {
         byte[] bytesFile;
         using (FileStream file = new FileStream(fuleSrc, FileMode.Open, FileAccess.Read))
         {
              bytesFile = new byte[file.Length];
              file.Read(bytes, 0, (int)file.Length);
         }
    
         return new BitArray(bytesFile);
    }
    

    【讨论】:

      【解决方案5】:

      使用FileStreamStreamWriterStringBuilderConvert 的解决方案

      static void Main(string[] args)
      {
          StringBuilder sb = new StringBuilder();
          using (FileStream fs = new FileStream(InputFILEPATH, FileMode.Open))
          {
                while (fs.Position != fs.Length)
                {
                    sb.Append(Convert.ToString(fs.ReadByte(),2));
                }
          }
          using (StreamWriter stw = new StreamWriter(File.Open(OutputFILEPATH,FileMode.OpenOrCreate)))
          {
                  stw.WriteLine(sb.ToString());
          }
         Console.ReadKey();
      }
      

      【讨论】:

        猜你喜欢
        • 2012-09-30
        • 1970-01-01
        • 2019-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-25
        • 1970-01-01
        • 2023-03-26
        相关资源
        最近更新 更多