2008-12-08 6 views
1

У меня есть значение реестра, которое хранится как двоичное значение (REG_BINARY), содержащее информацию о пути к файлу. Значение считывается в массив байтов. Но как я могу преобразовать его в читаемую строку?Как преобразовать значение REG_BINARY из реестра в строку? (vb.net)

Я прочитал о system.text.encoding.ASCII.GetString (значение), но это не сработает. Насколько мне известно, значение реестра - это произвольные двоичные данные, а не ASCII, что является причиной того, что метод создает бесполезные данные.

Кто-нибудь знает, как я могу преобразовать данные?

Пример: (Часть входа)

01 00 00 00 94 00 00 00 14 00 00 00 63 00 3A 00 5C 00 
70 00 72 00 6F 00 67 00 72 00 61 00 6D 00 6d 00 65 00 
5C 00 67 00 65 00 6D 00 65 00 69 00 6E 00 73 00 61 00 
6D 00 65 00 20 00 64 00 61 00 74 00 65 00 69 00 65 00 
6E 00 5C 

Благодаря смерзаться это должно быть:

............c.:.\.p.r.o.g.r.a.m.m.e.\.g.e.m.e.i.n.s.a.m.e. .d.a.t.e.i.e.n.\ 

сама запись была создана из Outlook. Это запись для инвалидов пункта надстройки (отказоустойчивость)

ответ

3

Ну, это не произвольно двоичных данных - это текстовые данные в некоторых вид кодирования. Вам нужно выяснить, что такое кодировка.

Я не удивлюсь, если Encoding.Unicode.GetString(value) работал - но если это не так, отправьте образец (в шестнадцатеричном формате), и я увижу, что я могу сделать. Что говорит документация о том, что там помещают данные?

EDIT: Похоже, Encoding.Unicode ваш друг, но, начиная с байта 12. Использование

Encoding.Unicode.GetString(bytes, 12, bytes.Length-12) 
+0

Encoding.Unicode не работайте. Надеюсь, образец поможет? – Marcus

+0

Причина, по которой она не работает, связана с ведущими 12 байтами. Отбросьте первые 12 байтов и передайте остальную часть Unicode.GetString(). –

+0

Отлично, он работает! Спасибо за вашу помощь :) – Marcus

0

Использование

Function Microsoft.Win32.RegistryKey.GetValue(name as String) as Object 

Также обратите внимание на System.Text.Encoding и System.Text.Encoding.Unicode

1

Я имел эта проблема тоже и я решил таким образом:

У меня была декларация красный переменная как:

Dim encoding As System.Text.Encoding = System.Text.Encoding.Unicode 

Тогда я делаю это в цикле:

For Each Val As String In ValueName 
     data = k.GetValue(Val) 
     ListRecent.Items.Add(Val & ": " & encoding.GetString(data)) 
    Next 

Так в ListBox под названием «ListRecent» я получил полный список последнего