Ну, читать это не сложно, просто используйте FileStream для чтения байта []. Преобразование его в текст на самом деле вообще невозможно или не имеет смысла, если только вы не конвертируете 1 и 0 в гекс. Это легко сделать с помощью перегрузки BitConverter.ToString (byte []). Как правило, вы хотите сбросить 16 или 32 байта в каждой строке. Вы можете использовать Encoding.ASCII.GetString (), чтобы попытаться преобразовать байты в символы. Пример программы, которая делает это:
using System;
using System.IO;
using System.Text;
class Program {
static void Main(string[] args) {
// Read the file into <bits>
var fs = new FileStream(@"c:\temp\test.bin", FileMode.Open);
var len = (int)fs.Length;
var bits = new byte[len];
fs.Read(bits, 0, len);
// Dump 16 bytes per line
for (int ix = 0; ix < len; ix += 16) {
var cnt = Math.Min(16, len - ix);
var line = new byte[cnt];
Array.Copy(bits, ix, line, 0, cnt);
// Write address + hex + ascii
Console.Write("{0:X6} ", ix);
Console.Write(BitConverter.ToString(line));
Console.Write(" ");
// Convert non-ascii characters to .
for (int jx = 0; jx < cnt; ++jx)
if (line[jx] < 0x20 || line[jx] > 0x7f) line[jx] = (byte)'.';
Console.WriteLine(Encoding.ASCII.GetString(line));
}
Console.ReadLine();
}
}
Вы можете использовать модуль B :: Xref для создания отчетов с перекрестными ссылками.
Я сам сталкивался с этой проблемой в прошлом. Я собрал небольшую небольшую программу, которая использует PPI для поиска подпрограмм. Он немного нормализует код (пробелы нормализованы, комментарии удалены) и сообщает о любых дубликатах. Работает достаточно хорошо. PPI делает всю тяжелую работу.
Вы можете сделать нормализацию немного умнее, нормализовав все имена переменных в каждой подпрограмме до $ a, $ b, $ c и, возможно, сделав что-то подобное для строк. Зависит от того, насколько агрессивным вы хотите быть.
#!perl
use strict;
use warnings;
use PPI;
my %Seen;
for my $file (@ARGV) {
my $doc = PPI::Document->new($file);
$doc->prune("PPI::Token::Comment"); # strip comments
my $subs = $doc->find('PPI::Statement::Sub');
for my $sub (@$subs) {
my $code = $sub->block;
$code =~ s/\s+/ /; # normalize whitespace
next if $code =~ /^{\s*}$/; # ignore empty routines
if( $Seen{$code} ) {
printf "%s in $file is a duplicate of $Seen{$code}\n", $sub->name;
}
else {
$Seen{$code} = sprintf "%s in $file", $sub->name;
}
}
}
Это может быть неудобно, но лучший инструмент для этого - ваш мозг. Просмотрите весь код и поймите его взаимосвязь. Попробуйте увидеть общие закономерности. Затем выполните рефакторинг!
Я пометил ваш вопрос меткой « рефакторинг ». На этом сайте вы можете найти интересные материалы, относящиеся к этой теме.
Если вы работаете в Linux, вы можете использовать grep
, чтобы помочь вам составить список всех функций в вашей кодовой базе. Возможно, вам нужно будет сделать то, что предлагает эфир, и действительно пройти через код, чтобы понять его, если вы еще этого не сделали.
Вот чрезмерно упрощенный пример:
grep -r "sub " codebase/* > function_list
Таким же образом можно искать дубликаты. Эта идея может быть менее эффективной, если вы используете ООП Perl.
Также стоит упомянуть NaturalDocs , инструмент для документирования кода. Это поможет вам двигаться вперед.