4 / 4 / 0
Регистрация: 20.09.2012
Сообщений: 95
1

Двоичный код файла перевести в wct систему счисления

15.07.2014, 09:58. Показов 1793. Ответов 19
Метки нет (Все метки)

Здравствуйте! Помогите пожалуйста склепать консольную программу без интерфейса, если написать converter.exe (имя программы) file.exe file.txt, то двоичный код файла будет переведён в wct систему счисления (как восьмеричная, но A B C D E F G O, можно просто в восьмеричную) и сохранён в file.txt без пробелов. Спасибо, очень срочно надо. Если не получится с консолью, пожалуйста, сделайте простое win32 приложение у которого не будет окна, но сделать она должна то же самое и завершиться. Жду, ещё раз ОГРОМНОЕ спасибо.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.07.2014, 09:58
Ответы с готовыми решениями:

Как перевести двоичный код в десятичную систему счисления, используя функцию?
хелпните нужно написать функцию перевода двоичного кода в десятичный на паскале

Вещественное число в 10-й системе счисления перевести в двоичный код
Вещественное число в 10-й системе счисления перевести в двоичный код(обратный и дополнительный)

Перевести код с Pascal на C#. Перевод в другую систему счисления
Напишите программу перевода десятичного числа в систему счисления с другим основанием Помогите...

Строка: Перевести число из римской системы счисления в десятичную систему счисления
Введите массив символов из 13 элементов. Перевести число из римской системы счисления в десятичную...

19
Эксперт Pascal/Delphi
6797 / 4559 / 4814
Регистрация: 05.06.2014
Сообщений: 22,438
16.07.2014, 12:44 2
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
program converter;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils;
 
const
  a: string[8] = 'ABCDEFGO'; {задаём строку для поиска
 в ней символов}
 
Var
   I : byte;
   f1:file of byte;
   f2:textfile;
 
 
{функция для перевода целой части числа из 10-й в любую сс}
function Cel(d: real; c: integer): string;
var
  s: string;
  n2: integer;
begin
  n2 := round(int(d)); {берём целую часть от числа}
  s := '';
  repeat
    s := ((a[n2 mod c + 1]) + s); {повторяем пока число не будет равно нулю берём целую часть при
    делении числа на основание и берём остаток + 1 от деления целой части на 16, записываем
    результат посимвольно в строку s}
    n2 := n2 div c;
  until (n2 = 0);
  Cel := s;
end;
 
begin
  if ParamCount < 2 then
    begin
      writeln('Malo parametrov');
      exit;
    end
  else
    begin
      assignfile(f1,paramstr(1));
      assignfile(f2,paramstr(2));
      reset(f1);
      rewrite(f2);
      while not eof(f1) do
        begin
          read(f1,i);
          write(f2,cel(i,8));
        end;
      closefile(f1);
      closefile(f2);
    end;
  { TODO -oUser -cConsole Main : Insert code here }
end.
Добавлено через 1 час 51 минуту
Забыл написать проверку на существование файла f1. Сами добавьте.
1
4 / 4 / 0
Регистрация: 20.09.2012
Сообщений: 95
16.07.2014, 13:07  [ТС] 3
Хм, не правильно работает. Открыл в нём файл 123.exe размером 2 кб, должно было получиться 6, а вышло 3..

Открыл программой .dfm файл, собрал обратно wct editor-ом. Вот что получилось:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
objectynzynMT Leftq`oFљЎ‘„=g№Ў
ФБТм4pХB†V–v‡Aћ†љ‘ЃI‘t=AИСОЌ9ЎНС
кмН€б
ЃЊLМХBfцзAq ™‘¤=“љ–‘”™’љJ@ЃЌСЋд6цЖч!6Еv–жFчuFW‡Fљ1‘qQ‰ФБНм-дХBfцзAqq‘iГСЎM
СLgi*yҐ¬бMБ`Ај±MT OldCreateOrderq`Falsei*I)™Ѓ‘‘ICСvi*)ЎA‘I‘ACСsi*yQ‘@‘LСMФ
‘LСMХB БLб Г†љ Topq`JB№‘!D=oЃЎЎ )‘9¤=g!‰Ў I)СЉОиФСЊом(i*B'textureHо!ЌСМЌLO/patternбЛмаБLОСN®pngAНT BмБNмРДБиаДиДС`specscalejб†0c®c†0jб†0c.c†0‘JB ‘Ў‘Б©,аq‘©СО
Дмб0СЌЋ! C.г†0QпwЃ¤ХB AОБOбNЊбЌСМОбLoplastaЛСЌиСLMж§qХB AОМбНLБN*bumpspecmapworldФХB
ДИ‘ОЊБN*Гљ‘qJ@СМЌЊМб ButtonъD'WGFцжљ Leftq`JBЎ‘„=g1©Ў ‘IЎCСшJBA‘I‘ACСµi*B6F–цбpб#гqњсsЃpк1Ћ7П‡6зО#гq”сwq`ХB
ДИ‘ОЊБN*Гљ OnClickq`Button‘‘a‘‘J@БMБ
T object‘)‘~є‘)‘yЎ )¤=pХB
СО Г¶ХB
ФБТм3a
T @ђБMLРб ГћХB
ДИ‘ОЊБN*Г&љ‘qJendi
Добавлено через 8 минут
Что не так?
0
Эксперт Pascal/Delphi
6797 / 4559 / 4814
Регистрация: 05.06.2014
Сообщений: 22,438
16.07.2014, 15:49 4
Значит, я неправильно понял задание. Я побайтово читаю из одного файла, перевожу в 8-ную систему счисления (в которую вы указали) и пишу в текстовый файл. Сначала проверил, сделал 16-ный и 8-й дампы. Все отработало нормально.
Значит, вам нужно нечто иное.
О структуре wсt не имею ни малейшего понятия.
Более подробно расписать задание сможете?
0
4 / 4 / 0
Регистрация: 20.09.2012
Сообщений: 95
16.07.2014, 16:03  [ТС] 5
Короче, надо чтоб вместо A (0) было AAA!
Вместо B - AAB,
Вместо GE - AGE.
Например, AEE = EE.
То есть надо, чтоб было по три буквы при конвертации из символа в число wct.
0
Эксперт Pascal/Delphi
6797 / 4559 / 4814
Регистрация: 05.06.2014
Сообщений: 22,438
16.07.2014, 16:18 6
То есть, просто не отбрасывать незначащий 0 (А) при переводе в 8-ную систему счисления?
Хорошо, теперь понятно
0
4 / 4 / 0
Регистрация: 20.09.2012
Сообщений: 95
16.07.2014, 16:29  [ТС] 7
КОРОЧЕ! Надо чтоб в каждом бите информации (бит типа символ) в СС wct НАДО ЧТОБ БЫЛО ТРИ БУКВЫ!!

ЕСЛИ В восьмеричной 7, то в wct AAO! ВОТ!

Добавлено через 35 секунд
Спасибо, кажется понятно объяснил.
0
Эксперт Pascal/Delphi
6797 / 4559 / 4814
Регистрация: 05.06.2014
Сообщений: 22,438
16.07.2014, 16:32 8
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
program converter;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils;
 
const
  a: string[8] = 'ABCDEFGO'; {задаём строку для поиска
 в ней символов}
 
Var
   I : byte;
   f1:file of byte;
   f2:textfile;
 
 
{функция для перевода целой части числа из 10-й в любую сс}
function Cel(d: real; c: integer): string;
var
  s: string;
  n2: integer;
begin
  n2 := round(int(d)); {берём целую часть от числа}
  s := '';
  repeat
    s := ((a[n2 mod c + 1]) + s); {повторяем пока число не будет равно нулю берём целую часть при
    делении числа на основание и берём остаток + 1 от деления целой части на 16, записываем
    результат посимвольно в строку s}
    n2 := n2 div c;
  until (n2 = 0);
  if length(s)<3 then
    for i:=length(s)+1 to 3 do
      s:='A'+s;
  Cel := s;
end;
 
begin
  if ParamCount < 2 then
    begin
      writeln('Not enough parameters!');
      exit;
    end
  else
    begin
      if fileexists(paramstr(1)) then
        begin
          assignfile(f1,paramstr(1));
          assignfile(f2,paramstr(2));
          reset(f1);
          rewrite(f2);
          while not eof(f1) do
            begin
              read(f1,i);
              write(f2,cel(i,8));
            end;
          closefile(f1);
          closefile(f2);
        end
      else
        begin
          writeln('File not exist!');
          exit;
        end;
    end;
  { TODO -oUser -cConsole Main : Insert code here }
end.
1
4 / 4 / 0
Регистрация: 20.09.2012
Сообщений: 95
16.07.2014, 16:38  [ТС] 9
ОГРОМНОЕ СПАСИБО!
0
Эксперт Pascal/Delphi
6797 / 4559 / 4814
Регистрация: 05.06.2014
Сообщений: 22,438
16.07.2014, 16:46 10
Сработало? А если не секрет, то что это было? Для чего нужно?
0
4 / 4 / 0
Регистрация: 20.09.2012
Сообщений: 95
16.07.2014, 16:57  [ТС] 11
А можете сделать, пожалуйста, чтобы всё было наоборот? Т.е. из wct в файл? Пожалуйста, не хватает только этого! Буду очень благодарен!
Очень срочно надо, объяснять нету времени, сделаете - расскажу, если будет время. Заранее спасибо. Убежал, очень спешу

P.S. У меня есть своя версия этой программы, но не консольная, и много места занимает и тормозит. Прошу помощи!
0
Эксперт Pascal/Delphi
6797 / 4559 / 4814
Регистрация: 05.06.2014
Сообщений: 22,438
16.07.2014, 17:02 12
Сегодня, скорее всего, нет. Завтра могу заняться.
0
4 / 4 / 0
Регистрация: 20.09.2012
Сообщений: 95
16.07.2014, 17:04  [ТС] 13
Эх, ну и на этом спасибо! Прошу не забыть, пожалуйста! Очень надо!

P.S. И если сможешь, постарайся пожалуйста, сегодня
0
Эксперт Pascal/Delphi
6797 / 4559 / 4814
Регистрация: 05.06.2014
Сообщений: 22,438
16.07.2014, 17:39 14
Проверяйте.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
program wct2exe;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils;
 
Var
   I : byte;
   ch:char;
   s:string;
   f2:file of byte;
   f1:textfile;
 
{функция для перевода (целой части числа) из любой СС в 10-ю}
function ToDec(var ss: string; cc: byte): integer;
const
  a: string[8] = '01234567'; {задаём строку для поиска}
var
  i, n, sum: integer;
begin
  sum := 0;
  n := length(ss); {присваиваем n - длину строки ss}
  for i := 1 to n do {идём по строке}
  begin
    dec(n); {уменьшаем счётчик на 1}
    sum := sum + round((pos(ss[i], a) - 1) * exp(ln(cc) * n)); {суммируем число (найденное в
    строке по позиции символа-1 (pos(ss[i],a)-1)) в степени dec(n)}
  end;
  ToDec := sum;
end;
 
function wct2oct(s:string):string;
var
  i:integer;
  ch:char;
  temp:string;
begin
  temp:='';
  for i:=1 to length(s) do
    begin
      case s[i] of
        'A': ch:='0';
        'B': ch:='1';
        'C': ch:='2';
        'D': ch:='3';
        'E': ch:='4';
        'F': ch:='5';
        'G': ch:='6';
        'O': ch:='7';
      end;
      temp:=temp+ch;
    end;
  wct2oct:=temp;
end;
 
begin
  if ParamCount < 2 then
    begin
      writeln('Not enough parameters!');
      exit;
    end
  else
    begin
      if fileexists(paramstr(1)) then
        begin
          assignfile(f1,paramstr(1));
          assignfile(f2,paramstr(2));
          reset(f1);
          rewrite(f2);
          while not eof(f1) do
            begin
              s:='';
              {читаем три wct символа}
              read(f1,ch);
              s:=s+ch;
              read(f1,ch);
              s:=s+ch;
              read(f1,ch);
              s:=s+ch;
              s:=wct2oct(s);
              i:=todec(s,8);
              write(f2,byte(i));
            end;
          closefile(f1);
          closefile(f2);
        end
      else
        begin
          writeln('File not exist!');
          exit;
        end;
    end;
  { TODO -oUser -cConsole Main : Insert code here }
end.
1
4 / 4 / 0
Регистрация: 20.09.2012
Сообщений: 95
16.07.2014, 17:50  [ТС] 15
ОГРОМНЕЙШЕЕ ВАМ СПАСИБО! ПРОСТО Я СЕЙЧАС ПИШУ КОМПИЛЯТОР ЯЗЫКА ПРОГРАММИРОВАНИЯ АЛГОРИТМ 3, И ДЛЯ УЛУЧШЕНИЯ ПРОИЗВОДИТЕЛЬНОСТИ ИСПОЛЬЗУЮ WCT. ЕЩЁ РАЗ СПА-СИ-БО! ВСЁ РАБОТАЕТ КАК ЧАСЫ!
0
4148 / 1803 / 213
Регистрация: 06.10.2010
Сообщений: 4,033
18.07.2014, 14:38 16
Кодирование (чуть короче)
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var
  data:         array of byte;
  size,i:       Cardinal;
  input,output: file;
begin
  reset  (input,paramstr(1),1);
  rewrite(output,paramstr(2),1);
  size:=filesize(input);
  SetLength(data,size shl 1);
  BlockRead(input,data[0],size);
  close(input);
  for i:=0 to size-1 do
  begin
    data[size+i*3+2]:=ord('ABCDEFGO'[data[i] and 7      +1]);
    data[size+i*3+1]:=ord('ABCDEFGO'[data[i] shr 3 and 7+1]);
    data[size+i*3+0]:=ord('ABCDEFGO'[data[i] shr 6      +1]);
  end;
  BlockWrite(output,data[size],size*3);
  close(output);
end.

Возможно на ассемблере будет немного быстрее
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
const
  wct: array[0..7] of AnsiChar='ABCDEFGO';
var
  data:         array of byte;
  size:         Cardinal;
  input,output: file;
begin
  reset  (input,paramstr(1),1);
  rewrite(output,paramstr(2),1);
  size:=filesize(input);
  SetLength(data,size shl 2+1);
  BlockRead(input,data[0],size);
  close(input);
  asm
  pushad
  mov ecx,[size]
  mov esi,[data]
  lea edi,[esi+ecx]
  xor eax,eax
  @b:lodsb
     mov edx,eax
     mov ebx,eax
     and eax,7
     shr edx,3
     and edx,7
     shr ebx,6
     mov ah,byte[wct+eax]
     mov al,byte[wct+edx]
     shl eax,8
     mov al,byte[wct+ebx]
     mov [edi],eax
     add edi,3
  loop @b
  popad
  end;
  BlockWrite(output,data[size],size*3);
  close(output);
end.

Декодирование
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const
  wct: array[ord('A')..ord('O')] of byte=(0,1,2,3,4,5,6,0,0,0,0,0,0,0,7);
var
  data:         array of byte;
  size,i:       Cardinal;
  input,output: file;
begin
  reset  (input,paramstr(1),1);
  rewrite(output,paramstr(2),1);
  size:=filesize(input) div 3;
  SetLength(data,size shl 2);
  BlockRead(input,data[0],size*3);
  close(input);
  for i:=0 to size-1 do
    data[size*3+i]:=wct[data[i*3]] shl 6+wct[data[i*3+1]] shl 3+wct[data[i*3+2]];
  BlockWrite(output,data[size*3],size);
  close(output);
end.

на асме
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
const
  wct: array['A'..'O'] of byte=(0,1,2,3,4,5,6,0,0,0,0,0,0,0,7);
var
  data:         array of byte;
  size:         Cardinal;
  input,output: file;
begin
  reset  (input,paramstr(1),1);
  rewrite(output,paramstr(2),1);
  size:=filesize(input) div 3;
  SetLength(data,size shl 2);
  BlockRead(input,data[0],size*3);
  close(input);
  asm
  pushad
  mov ecx,[size]
  mov esi,[data]
  lea edi,[esi+ecx*2]
  add edi,ecx
  @b:lodsb
     movzx edx,byte[wct+eax-'A']
     lodsb
     movzx ebx,byte[wct+eax-'A']
     lodsb
     movzx eax,byte[wct+eax-'A']
     lea   edx,[edx*8+ebx]
     lea   eax,[edx*8+eax]
     stosb
  loop @b
  popad
  end;
  BlockWrite(output,data[size*3],size);
  close(output);
end.


Кодирование можно существенно ускорить если использовать полноценную таблицу на 256 элементов.
1
Эксперт Pascal/Delphi
6797 / 4559 / 4814
Регистрация: 05.06.2014
Сообщений: 22,438
18.07.2014, 15:49 17
Вот это да!
Сразу видно код мастера.
С удовольствием надавил на весы.
0
4 / 4 / 0
Регистрация: 20.09.2012
Сообщений: 95
06.10.2014, 21:58  [ТС] 18
murderer
Неправильно работает декодер на асме.. :C
Вместо букв получается абракадабра..

+

Можешь помочь пожалуйста?
Надо сделать на асме (кодирование), чтоб можно было использовать не только верхний регистр букв (AAABBBCCC), но и например так: (AaAbBBCcc)... пожалуйста!

Добавлено через 40 секунд
murderer, выручай!
0
4 / 4 / 0
Регистрация: 20.09.2012
Сообщений: 95
30.01.2015, 00:38  [ТС] 19
Спасибо, выпустил новую верисю Wct Editor-a, написанного на самом себе. Теперь он весит аж 25 кб.
0
4 / 4 / 0
Регистрация: 20.09.2012
Сообщений: 95
25.08.2015, 18:34  [ТС] 20
Ух, как давно всё это было, аж за душу берёт =).
Вы не поверите, сделал версию для линукса и переписал для венды. Сам. Получилось 10 килобайт.
Без вас бы я не справился, спасибо за всё! :-)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.08.2015, 18:34
Помогаю со студенческими работами здесь

Системы счисления. Перевести данное натуральное число в 16-тиричную систему счисления
Составить программу перевода данного натурального числа n в 16теричную систему счисления....

Как перевести число с 16 системы счисления в 2 систему счисления (программа)
Как перевести число с 16 системы счисления в 2 систему счисления ? (программа).

Перевести число из системы счисления с основанием 19 в десятичную систему счисления
Уважаемые разбирающиеся во всём этом люди, прошу вас помочь мне с этой задачей Примечания...

Как перевести из шестнадцатиричной системы счисления в двоичную систему счисления
не могу понять как правильно надо это сделать ?? простым подбором не интересно

Проверить корректность числа в заданной системе счисления и перевести в другую систему счисления
На вычислительной практике дали такое задание: С клавиатуры вводятся 2 положительных целых...

Перевести целие числа из деятичной системы счисления в систему счисления с любым другим основанием
Помогите. Сделал чтоб переводило из 10 в 1,2,3,4,5,6,7,8,9 .Вся проблема в том что я незнаю как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru