Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.02.2014, 02:58   #81
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,429
По умолчанию

Например, считали в "a" 14 байт, и нужно "исправить" их:
Код:
procedure zeroing(var buffer; count: longint);
var
  i: integer;
  p: ^Byte;
begin
  p := @buffer;
  for i := 0 to count - 1 do
  begin
    if p^ = 255 then
      p^ := 0;
    inc(p);
  end;
end;
...
Stream.Read(a, 14);
zeroing(a, 14);
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 06.02.2014, 04:32   #82
Семён-2014@
Пользователь
 
Регистрация: 28.01.2014
Сообщений: 37
По умолчанию ответ

Цитата:
Сообщение от BDA Посмотреть сообщение
Например, считали в "a" 14 байт, и нужно "исправить" их:
Код:
procedure zeroing(var buffer; count: longint);
var
  i: integer;
  p: ^Byte;
begin
  p := @buffer;
  for i := 0 to count - 1 do
  begin
    if p^ = 255 then
      p^ := 0;
    inc(p);
  end;
end;
...
Stream.Read(a, 14);
zeroing(a, 14);
Честно говоря не понял, а что эта за процедура, как её подключить?
У меня процедура уже есть , это загрузить файл, а эту процедуру как создать ? Если можно по подробней?.
Семён-2014@ вне форума Ответить с цитированием
Старый 06.02.2014, 15:04   #83
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,429
По умолчанию

В общем, размещаете код процедуры zeroing выше той процедуры, в которой будете его вызывать первый раз (можно, например, сразу после слова implementation). Затем, когда в считанных данных нужно исправить FF на 0, вызываете процедуру zeroing. Параметры процедур read и zeroing совпадают для удобства (с чем вызвал одно, с тем же вызываешь второе).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 06.02.2014, 15:29   #84
Семён-2014@
Пользователь
 
Регистрация: 28.01.2014
Сообщений: 37
По умолчанию ответ

Цитата:
Сообщение от BDA Посмотреть сообщение
В общем, размещаете код процедуры zeroing выше той процедуры, в которой будете его вызывать первый раз (можно, например, сразу после слова implementation). Затем, когда в считанных данных нужно исправить FF на 0, вызываете процедуру zeroing. Параметры процедур read и zeroing совпадают для удобства (с чем вызвал одно, с тем же вызываешь второе).
Не выходит вставить эту процедуру, если ставлю после implementation, компилятору не нравится созданная уже мной , ранее процедура и он в неё упирается и ошибка procedure TForm1.SpeedButton1Click(Sender: TObject);
Требует видимо чтоб я выбрал. Как не пытаюсь вставить эту процедуру, не выходит, ошибка возникает и всё тут.

Код:
implementation

{$R *.dfm}

procedure TForm1.SpeedButton1Click(Sender: TObject);
 var Stream: TFileStream;
a: array [0..1023] of Byte;
begin
with OpenDialog1 do
 if Execute then
begin
Stream:=TFileStream.Create(OpenDialog1.FileName,fmOpenReadWrite or fmShareDenyNone);
SpeedButton2.Enabled := (Stream.Size = 315);
if Stream.Size<>315 then
ShowMessage('не допустимый размер файла!')
else
begin
if Stream.Size=315 then
begin
Stream.Position:=$BE;
Stream.Read(a,16);
Label1.Caption:=IntToStr(a[0]);
Label2.Caption:=IntToStr(a[1]);
Вот мой уже созданный код, а как вставить Вашу процедуру не получается, не выше implementation, не ниже.

Последний раз редактировалось Семён-2014@; 06.02.2014 в 15:38. Причина: добавить
Семён-2014@ вне форума Ответить с цитированием
Старый 06.02.2014, 19:02   #85
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,429
По умолчанию

Код:
implementation

{$R *.dfm}

procedure zeroing(var buffer; count: longint);
var
  i: integer;
  p: ^Byte;
begin
  p := @buffer;
  for i := 0 to count - 1 do
  begin
    if p^ = 255 then
      p^ := 0;
    inc(p);
  end;
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
 var Stream: TFileStream;
a: array [0..1023] of Byte;
begin
with OpenDialog1 do
 if Execute then
begin
Stream:=TFileStream.Create(OpenDialog1.FileName,fmOpenReadWrite or fmShareDenyNone);
SpeedButton2.Enabled := (Stream.Size = 315);
if Stream.Size<>315 then
ShowMessage('не допустимый размер файла!')
else
begin
if Stream.Size=315 then
begin
Stream.Position:=$BE;
Stream.Read(a,16);
zeroing(a, 16);
Label1.Caption:=IntToStr(a[0]);
Label2.Caption:=IntToStr(a[1]);
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 06.02.2014, 20:42   #86
Семён-2014@
Пользователь
 
Регистрация: 28.01.2014
Сообщений: 37
По умолчанию ответ

Цитата:
Сообщение от BDA Посмотреть сообщение
Код:
implementation

{$R *.dfm}

procedure zeroing(var buffer; count: longint);
var
  i: integer;
  p: ^Byte;
begin
  p := @buffer;
  for i := 0 to count - 1 do
  begin
    if p^ = 255 then
      p^ := 0;
    inc(p);
  end;
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
 var Stream: TFileStream;
a: array [0..1023] of Byte;
begin
with OpenDialog1 do
 if Execute then
begin
Stream:=TFileStream.Create(OpenDialog1.FileName,fmOpenReadWrite or fmShareDenyNone);
SpeedButton2.Enabled := (Stream.Size = 315);
if Stream.Size<>315 then
ShowMessage('не допустимый размер файла!')
else
begin
if Stream.Size=315 then
begin
Stream.Position:=$BE;
Stream.Read(a,16);
zeroing(a, 16);
Label1.Caption:=IntToStr(a[0]);
Label2.Caption:=IntToStr(a[1]);
BDA супер ! точ-то доктор прописал, огромное спасибо! всё сработало, в лучшем виде, я процедуру не там вставлял, вот и касяк мой. Теперь и этот урок усвоил. Благо в новой проге, его применять придётся не раз.
Первая это разминка, дет- сад была, сейчас серьёзное дело предстоит и писать и искать и проверять найденное и тестировать.... Подводных камней будет много, они остановили многих желающих написать её программистов, но мы попробуем сообща решить эту задачу, кто то должен быть перво открывателем в конце концов. Обещаю скучно не будет. Ещё раз спасибо огромное!!!
Семён-2014@ вне форума Ответить с цитированием
Старый 06.02.2014, 21:26   #87
Семён-2014@
Пользователь
 
Регистрация: 28.01.2014
Сообщений: 37
По умолчанию продолжение темы

Одну решили благодаря BDA, вторая проблема подошла, есть данные записаны они так: 555150505156575F50545F5054
Задача стоит как обрезать, или пропустить всё лишние и вывести нужное, должно получится так: 51001667_04_04
То-есть первые 8 бит от байта обрезать, или проигнорить, пропускать, а нужное выводить, далее идут в позиции места где надо пропустить байт, и байт, далее опять первые 8 бит пропустить и вывести одним нужным значением.
Семён-2014@ вне форума Ответить с цитированием
Старый 07.02.2014, 00:42   #88
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,429
По умолчанию

С последней проблемой, думаю, разобрались - там просто текст записан в обычной однобайтовой кодировке ASCII (а тут получилась излишняя секретность, поэтому догадаться без допданных было бы проблематично).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 07.02.2014, 11:34   #89
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
function ParceByte1(var buffer; count: Integer): String;
var i: integer;
    p: ^Byte;
begin
  p:=@buffer;
  Result:='';
  for i:=0 to count-1 do begin
    //символ _ в игнор не зависимо от место расположения
    if p^<>$5F then Result:=Result+IntToHex(p^ and $F,1);
    inc(p);
  end;
end;

обращаться

var a: array [0..1023] of Byte;
...
Label1.Caption:=ParceByte1(a,13);

где в a 13 байт считанных их файла
За основу взял процедуру от BDA с теми же параметрами и ради того же
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 08.02.2014, 03:04   #90
Семён-2014@
Пользователь
 
Регистрация: 28.01.2014
Сообщений: 37
По умолчанию ответ

Цитата:
Сообщение от Аватар Посмотреть сообщение
Код:
function ParceByte1(var buffer; count: Integer): String;
var i: integer;
    p: ^Byte;
begin
  p:=@buffer;
  Result:='';
  for i:=0 to count-1 do begin
    //символ _ в игнор не зависимо от место расположения
    if p^<>$5F then Result:=Result+IntToHex(p^ and $F,1);
    inc(p);
  end;
end;

обращаться

var a: array [0..1023] of Byte;
...
Label1.Caption:=ParceByte1(a,13);

где в a 13 байт считанных их файла
За основу взял процедуру от BDA с теми же параметрами и ради того же
Замучился сегодня не по детски, в этой новой проге, смешивается всё, причём то применять одно приходится, то прямо противоположенное...
мучился чтоб последние цифры отодвинуть в право от основных, ну и подогнать чтоб . Получится, то получилось, тут и старые посты на выручку пришли, всё работает, но смущает, не много ли и процедуру и функцию в одном месте пришлось объявлять, как то всё длинно и заморочено получилось у меня, но работает всё, огромное спасибо!!! как всегда Вы вовремя Аватар на помощь пришли, да и то намучился пока эту конструкцию выстроил.

Код:
implementation

{$R *.dfm}

procedure zeroing(var buffer; count: longint);
var
i: integer;
p: ^Byte;
begin
p := @buffer;
for i := 0 to count - 1 do
begin
if p^ = 255 then
p^ :=0;
inc(p);
end;
end;
function ParceByte1(var buffer; count: Integer): String;
 var i: integer;
    p: ^Byte;
begin
p:=@buffer;
Result:='';
for i:=0 to count-1 do begin
//символ _ в игнор не зависимо от место расположения
if p^<>$5F then Result:=Result+IntToHex(p^ and $F,1);
inc(p);
end;
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
var Stream: TFileStream;
a: array [0..1023] of Byte;
F: File of byte;
Size: Integer;
begin
with OpenDialog1 do
if Execute then
begin
Stream:=TFileStream.Create(OpenDialog1.FileName,fmOpenReadWrite or fmShareDenyNone);
SpeedButton2.Enabled := (Stream.Size = 300);
if Stream.Size<>300 then
ShowMessage('не допустимый размер файла!')
else
begin
if Stream.Size=300 then
begin
AssignFile(F, FileName);
Reset(F);
Size:=Filesize(F);
CloseFile(F);
begin
Label40.Caption:=IntToStr(Size);
Stream.Position:=$C0;
Stream.Read(a,16);
zeroing(a, 16);
Label1.Caption:=IntToStr(a[0]);
Label2.Caption:=IntToStr(a[1]);
Label3.Caption:=IntToStr(a[2]);
Label4.Caption:=IntToStr(a[3]);
Label5.Caption:=IntToStr(a[4]);
Label6.Caption:=IntToStr(a[5]);
Label7.Caption:=IntToStr(a[6]);
Label8.Caption:=IntToStr(a[7]);
Label9.Caption:=IntToStr(a[8]);
Label10.Caption:=IntToStr(a[9]);
Label11.Caption:=IntToStr(a[10]);
Label12.Caption:=IntToStr(a[11]);
Label13.Caption:=IntToStr(a[12]);
Label14.Caption:=IntToStr(a[13]);
Label15.Caption:=IntToStr(a[14]);
Label16.Caption:=IntToStr(a[15]);
end;
end;
Stream.Position:=$D0;
Stream.Read(a,16);
Label17.Caption:=IntToHex(a[0],2);
Stream.Position:=$90;
Stream.Read(a,14);
Label18.Caption:=ParceByte1(a,9)+'   '+ParceByte1(a[9],2)+'  ' +ParceByte1(a[11],3);
end;
Stream.Free;
end
end;

Последний раз редактировалось Семён-2014@; 08.02.2014 в 03:06.
Семён-2014@ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
file->HEX HEX->BIN kakawkin Общие вопросы Delphi 1 25.04.2012 01:02
перевод чисел из hex в bin. ASM. crashmanx Помощь студентам 0 25.12.2011 21:35
Нужно реализовать программу на Дельфи Aizada Помощь студентам 1 16.05.2011 21:45
Перевод BIN -> HEX Piar Помощь студентам 2 20.05.2009 15:44