Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
 
EEjester
1 / 1 / 5
Регистрация: 28.03.2013
Сообщений: 299
#1

Считать байт по адресу в файле - Delphi

29.07.2015, 11:54. Просмотров 1365. Ответов 25
Метки нет (Все метки)

Например есть файл, в НЕХ выглядит так: e9 02 00 08 e9 02
http://www.cyberforum.ru/delphi-beginners/thread1409831.html
Как прочитать данные с байта по адресу 4 ? Должно получиться 00.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.07.2015, 11:54
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Считать байт по адресу в файле (Delphi):

Как считать каждый байт из файла, используя поток?
Исходный файл содержит информацию порциями по 55 байт (пакеты). Необходимо...

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

Как использовать функцию, выдающую через переменную типа байт результат, объём которого больше, чем байт?
Есть сканер отпечатков. Для него есть компонент ActiveX. У этого компонента...

в файле input.txt задана вещественно значимая матрица 3×4 считать эту матрицу в компонент stringrid
в файле input.txt задана вещественно значимая матрица 3×4 считать эту матрицу в...

Считать один байт по адресу $0001:$0231 из памяти компьютера
как в Паскале считать один байт по адресу $0001:$0231 из памяти компьютера...

25
Cyborg Drone
Модератор
5249 / 3116 / 2432
Регистрация: 17.08.2012
Сообщений: 10,067
30.07.2015, 17:21 #21
Цитата Сообщение от EEjester Посмотреть сообщение
e9 02 00 08 e9 02
Цитата Сообщение от EEjester Посмотреть сообщение
данные с байта по адресу 4 ? Должно получиться 00.
Это который байт номер 4?
Этот, который и не байт вовсе, а не пойми что, то ли ниббл, что суть $0, то ли явно не $00, а $30:
e9 02 00 08 e9 02
или этот
e9 02 00 08 e9 02
который, если по-человечески считать, то есть, с начала строки, а не с конца, либо третий (если считать от 1) либо второй (если считать от 0), но уж никак не четвёртый.

00 получается, если считать с конца строки, но так в нормальных дурдомах не делают. Всё же как-то принято в Европе слева направо считать, не китайцы, чай. Ещё подумал, может, у Вас в файл пишутся 16-битные слова младшим байтом вперёд, а читаются байты, но... Опять как-то не сходится.

Народ, я чего-то не понимаю, или всё же пора мне, для профилактики, снова за счётные палочки браться?
0
EEjester
1 / 1 / 5
Регистрация: 28.03.2013
Сообщений: 299
31.07.2015, 07:09  [ТС] #22
Цитата Сообщение от Игорь[Igor] Посмотреть сообщение
Delphi
1
2
3
4
5
6
7
procedure TForm1.Button1Click(Sender: TObject);
var
  s: string;
begin
  s:='00';
ShowMessage('По адресу 4 находится "'+s+'"');
end;
: \

Добавлено через 37 минут
Получилось!!! Мож кому надо:
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
function StrToHex(source: String): String;
var i:integer;
    c:Char;
    s:String;
begin
    s := '';
    for i:=1 to Length(source) do
    begin
      c := source[i];
      s := s +  IntToHex(Integer(c),2)+' ';
    end;
    result := s;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
const
  MaxLen = 128;
var
  f:file;
  s:string[MaxLen];
  Cnt : Integer;
begin
  if not opendialog1.execute then Exit;
  AssignFile(f, opendialog1.FileName);
  FileMode:=fmOpenRead;
  Reset(f,1);
  Seek(f, 4);
  blockread(f,s[1], 1, Cnt);
  SetLength(s, Cnt);
  closefile(f);
  edit1.text:=StrToHex(s);
end;
0
krapotkin
3295 / 2935 / 1015
Регистрация: 14.04.2014
Сообщений: 14,253
Записей в блоге: 13
31.07.2015, 07:15 #23

Не по теме:

не знаю, как смайлик facepalm изобразить. но он вот тут


в строку длиной MaxLen мы считываем 1 байт
а чем изначально байт-то не угодил???
integer(C) - это 4 байта, 3 из которых ==0. т.е. остается тот самый изначальный байт из самого первого примера...

Не по теме:

facepalm again

0
Cyborg Drone
31.07.2015, 07:21
  #24

Не по теме:

krapotkin, = :facepalm:

0
EEjester
1 / 1 / 5
Регистрация: 28.03.2013
Сообщений: 299
31.07.2015, 07:38  [ТС] #25
del...

Добавлено через 1 минуту
Цитата Сообщение от krapotkin Посмотреть сообщение
а чем изначально байт-то не угодил???
твой пример не работал, мой работает.
0
krapotkin
3295 / 2935 / 1015
Регистрация: 14.04.2014
Сообщений: 14,253
Записей в блоге: 13
31.07.2015, 08:55 #26
бедняжка, не работает...
а скриншоты я очевидно в фотошопе рисовал )))

пора уже раскрыть тебе тайну, что не все йогурты даже текстовые файлы одинаковы
некоторые каждый символ кодируют в 1 байт, тогда в файле может быть использовано только 256 разных символов, для интернациональных текстов с ударениями и диакритическими знаками этого маловато
поэтому для них изобрели много! UNICODE кодировок, где каждый символ кодируется 1, 2, 3 или даже 4 байтами!
Уфф.
Для того, чтобы разбираться, что за текстовый файл нам подсунули, стандарты рекомендуют в начало файла писать заголовок, опять 2.3.4 байта, тьфу. Подробности
На текущий момент у нас тут фактическим стандартом стала кодировка UTF-8 и в этом случае в начало файла пишутся 3 байта $ef $bb $bf, после которых начинается само содержимое, латинские символы и цифры - 1 байт, остальные - 2!
специально для работы с файлами в разных кодировках можно указывать в конструкторах потомков TFileStream параметр TEncoding
и именно поэтому доисторические варианты Reset() Assign() FileOpen() сейчас стараются не применять...

а теперь специально повторю фрагмент и скриншот
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
procedure TForm1.Readbytes;
var
  fs : TFileStream;
  b : byte;
  fname:string;
  i:Integer;
begin
  fname := ExtractFilePath(ParamStr(0))+'test.txt';
  fs := TFileStream.Create(FName, fmOpenRead);
  for i := 0 to 8 do
  begin
    // вот Seek в этом конкретном примере не нужен, т.к. каждое чтение и так двигает
    // указатель на 1 байт вперед, но когда нам надо прочитать отдельный N-й байт файла, это пригодится
    fs.Seek(i, soFromBeginning); 
    fs.Read(b,1);
    m1.Lines.Add(IntToStr(i)+'-й байт = $'+IntToHex(b,2));
  end;
  fs.free;
end;
получается, что даже если ты знаешь, что у тебя в тексте буква "я" стоит третьей от начала, ты абсолютно не в курсе какой байт читать и сколько, чтобы её прочитать из этого текстового файла...
0
Миниатюры
Считать байт по адресу в файле  
31.07.2015, 08:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2015, 08:55
Привет! Вот еще темы с решениями:

Считать массив байт записанный на определенной строке в файле
Всем привет, пришел к вам за помощью). Я научился читать любую строку в...

Посчитать в файле количество нулевых байт и различных байт
Посчитать в файле кол-во нулевых байт и различных байт Кто решит буду весьма...

Переход по адресу из массива байт
не знаю просто как правильно назвать тему до форматирования пк была у меня она...

Какой байт находится по адресу 1ABD0h после выполнения следующих действий
В регистрах следующие значения: DS: 1000h, EAX: 7934FFFFh, EBX: 00001234, EDX:...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru