|
Вопрос # 5 584/ вопрос решён / |
|
Здравствуйте! Как прочитать бинарные данные из реестра (REG_BINARY)?
Маюсь между 2-мя вариантами:
путь в реестре - [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Management\ARPCache\CnWizards]
(см. приложение)
а вот второй вариант возвращает точь в точь то что мы видим в кодированном виде, типо того - 28 02 00 00 01 00 00 00 00 60 15 01 00 00 00 ...
Как дальше быть? ведь в этом коде спрятана строка (путь к файлу).
Приложение: Переключить в обычный режим-
- ...
- var Buf: array [0..4] of Char;
- ...
- bufferSize:=Reg_Scanner.GetDataSize('SlowInfoCache');
-
- 2-
- ...
- Const RegR :Array[0..4] of Cardinal=(HKEY_CLASSES_ROOT, HKEY_CURRENT_USER,
- HKEY_LOCAL_MACHINE, HKEY_USERS,
- HKEY_CURRENT_CONFIG);
- var
- Form1: TForm1;
- Procedure RedBin(R :HKEY; K,Valb :String; Lst :TStrings);
- implementation
-
- {$R *.dfm}
- ...
- Procedure RedBin(R :HKEY; K,Valb :String; Lst :TStrings);
- var Reg :TRegistry;
- Siz :LongInt;
- Buf :Array of Byte;
- I,II :Integer;
- S :WideString;
- begin
- Reg := TRegistry.Create;
- Try
- Reg.RootKey := R;
- If Reg.OpenKeyReadOnly(K) then
- begin
-
- If Reg.ValueExists(Valb)And(Reg.GetDataType(Valb)=RdBinary) then
- begin
- Siz :=Reg.GetDataSize(Valb);
- SetLength(Buf, Siz);
- Reg.ReadBinaryData(Valb, Buf[0], Siz);
- II := Length(Buf);
- If II>0 then
- begin
- Lst.Clear;
- S:=Format('%s = ', [Valb]);
- For I:=0 To II-1 Do
- S := S + IntToHex(Buf[I], 2)+' ';
- Lst.Text := S;
- end;
- end
- Else
-
-
- Reg.CloseKey;
- end;
- Finally
- SetLength(Buf, 0);
- Reg.Free;
- End;
- end;
-
- procedure TForm1.Button1Click(Sender: TObject);
- begin
- Rot := RegR[RG1.ItemIndex];
- RedBin(Rot, Edit1.Text, Edit2.Text, Mem1.Lines);
- end;
 |
Вопрос задал: eclipse (статус: Посетитель)
Вопрос отправлен: 18 августа 2011, 18:42
Состояние вопроса: решён, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 15; последнее сообщение — 20 августа 2011, 17:50; участников в обсуждении: 3.
|
Вадим К (статус: Академик), 18 августа 2011, 19:47 [#1]:
первый вариант возвращает 552, потому что Вы запрашиваете 4 байта. (28 02 00 00, а теперь вспоминаем об обратном порядке байт, разворачиваем...).
Второй способ более правильный, он запрашивает длину, а потом извлекает все данные. Потом эти данные кодирует и возвращает в виде строки. Поэтому, тут на самом деле один вариант, просто в первом случае немного просто, а во втором - более общий вариант.
Как быть дальше? а никак. Ваш вопрос в чем? как прочитать бинарные данные. Вы их прочитали. Во втором примере кода они находятся в массиве Buf.
Поэтому нужно задать правильный вопрос - "вот есть бинарные данные, и в них спрятан путь. Как его извлечь?".
А тут уже нужно думать и гадать. там может быть что угодно. Но можно скачать сорцы CnWizard'а и посмотреть как они пишут/читают. Сразу станет понятно.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
eclipse (статус: Посетитель), 18 августа 2011, 20:39 [#2]:
Может и скачать... Тогда как ...вот есть бинарные данные, и в них спрятан путь. Как его извлечь?
|
|
Вадим К (статус: Академик), 18 августа 2011, 20:41 [#3]:
нужно посмотреть, как его туда запаковали. В тех данных, которые Вы привели, никакого пути не видно.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
bugmenot (статус: 3-ий класс), 18 августа 2011, 21:54 [#5]:
Цитата (eclipse):
http://s44.radikal.ru/i106/1108/45/b1ed72296c8e.jpg
Как будто стало видно лучше. Сколько, блин, раз говорить надо - JPEG не подходит для скриншотиков.
виконання програми розпочинається з того самого мiсця, де призупинилося.
|
|
Вадим К (статус: Академик), 19 августа 2011, 16:29 [#6]:
А можно просто скопировать нужный участок и не сжимать в размере? а то вырвиглаз полный.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
eclipse (статус: Посетитель), 19 августа 2011, 20:18 [#8]:
Прикол то в том, что пару месяцев назад я как-то смог прочитать эти данные, причём код был буквально в пару строк. А щас не могу найти этот кусок куда сунул!
|
|
eclipse (статус: Посетитель), 19 августа 2011, 20:56 [#9]:
Кусок куда не нашёл ... но!
Посидел... почасал репу... и прикинул что эти данные -28 02 00 00, они же ведь циферки! Попробывал их пререкодировать так Char(28)... и т.д., при этом 00 ничего не довало (пусто) и я их просто все убрал получилось вот такая строка "=28=02=01=60=15=01=10=E9=66=70=3E=F1=CB=01=43=3A=5C=50=72=6F=67=72=61=6D=20=46=69=6C=65=73=5C=42=6F=72=6C=61=6E=64=5C=44=65=6C=70=68=69=37=5C=45=78=70=65=72=74=73=5C=43=6E=57=69=7A=61=72=64=73=5C=43=6E=53=65=6C=65=63=74=4C=61=6E=67=2E=65=78=65"
Сотворил с ней манипуляции с Char и появилось то что нужно - "(`йfp>сЛC:\Program Files\Borland\Delphi7\Experts\CnWizards\CnSelectLang.exe"
|
19 августа 2011, 20:57: Статус вопроса изменён на решённый (изменил автор вопроса — eclipse): Сам допёр.
|
Вадим К (статус: Академик), 19 августа 2011, 21:12 [#10]:
убрать нули... очень остроумно. Это же классический пример юникодной строки в UTF-16! (в делфи есть много функций для подобных преобразований).
Галочка "подтверждения прочтения" - вселенское зло.
|
|
eclipse (статус: Посетитель), 19 августа 2011, 21:14 [#11]:
Ага! Прикольно выходит! Только теперь бы хотя бы понять почему так?
|
|
eclipse (статус: Посетитель), 20 августа 2011, 10:00 [#12]:
Заметил один ньюанс - For I:=0 To II-1 Do ну жно искать по баитам до конца, а то последний теряется т.е. так For I:=0 To II Do.
|
|
Вадим К (статус: Академик), 20 августа 2011, 12:09 [#13]:
Цитата (eclipse):
Прикольно выходит! Только теперь бы хотя бы понять почему так? Почему прикольно? а этого я уже не знаю. Как по мне - то там обычный юникод. И ничего дивного.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
eclipse (статус: Посетитель), 20 августа 2011, 15:30 [#14]:
Прикольно в том плане, что без нулей всё нормально перекодируется.
|
|
Вадим К (статус: Академик), 20 августа 2011, 17:50 [#15]:
потому что у данного вида юникода латиница кодируется двумя байтами, первый с которых всегда 0. Если бы путь содержал кириллицу, все было бы интересней
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|