Программа, которая отображает собственный двоичный код тремя способами в C#
Недавно я хотел поставить кусок двоичного кода в книгу, чтобы показать, какой код действительно выглядит на компьютере, поэтому я написал эту программу. Это не впечатляюще полезная программа, но она демонстрирует несколько полезных методов обработки строк.
Когда программа запускается, он выполняет следующий код.
private void Form1_Load(object sender, EventArgs e) { byte[] bytes = File.ReadAllBytes(Application.ExecutablePath); StringBuilder sb = new StringBuilder(); for (int i = 0; i < bytes.Length; i++) { string value = Convert.ToString(bytes[i], 2); value = value.PadLeft(8, '0'); sb.Append(value + ' '); } txtResult.Text = sb.ToString(); }
Код получает исполняемый путь приложения (полный путь к исполняемому файлу .exe) и использует метод File.ReadAllBytes для чтения его содержимого в массив byte.
Затем код перебирает байты. Он использует Convert.ToString для преобразования каждого байта в двоичное представление и использует метод PadLeft для строки, чтобы добавить 0s слева, чтобы результат получил 8 символов. Он добавляет представление байта в строку txt, за которой следует пробел.
Когда он будет завершен, программа отобразит результат.
Методы File.ReadAllBytes, Convert.ToString и PadLeft делают это относительно простым, но есть еще один полезный метод, который может сделать кода даже короче, исключая цикл for. Следующий код выполняет то же, что и исходный код.
byte[] bytes = File.ReadAllBytes(Application.ExecutablePath); string[] strings = Array.ConvertAll(bytes, b => Convert.ToString(b, 2).PadLeft(8, '0')); txtResult.Text = string.Join(" ", strings);
Эта версия использует File.ReadAllBytes как прежде, чтобы читать байты исполняемого файла в массиве.
Затем код использует Array.ConvertAll для преобразования значений в массив из байтов в строки. Метод Array.ConvertAll принимает в качестве параметров массив для преобразования и функцию преобразователя. В этом примере используется выражение lambda для преобразования ввода b в строку. Lambda вызывает Convert.ToString для значения b, а затем вызывает метод PadLeft в результате этой строки.
Когда Array.ConvertAll заканчивается, он возвращает байты, преобразованные в массив строк. Код вызывает метод string.Join для объединения строк в массиве, разделенных пробелами. Затем код отображает результат.
В этот момент у вас есть два способа заставить программу отобразить свой двоичный код. Просто для удовольствия я решил добавить решение LINQ. Следующий код показывает, как вы можете использовать LINQ для отображения кода программы.
var query = from byte b in File.ReadAllBytes(Application.ExecutablePath) select Convert.ToString(b, 2).PadLeft(8, '0'); txtResult.Text = string.Join(" ", query.ToArray());
Этот код объявляет запрос LINQ, который выполняет итерацию по байтам, возвращаемым методом File.ReadAllBytes. Для каждого байта запрос выбирает результат, возвращаемый Convert.ToString, за которым следует PadLeft. Затем код вызывает метод ToArray запроса для выполнения запроса и сохранения результатов в массиве. Он использует string.Join для преобразования массива строк в одну строку и отображения результата.
Обратите внимание, что все три версии занимают примерно столько же времени. (Хотя если вы присоедините строки к строковой переменной вместо использования StringBuilder, первое решение займет примерно вдвое больше, чем остальные.)