Разбор реестра. Двоичные значения в текстовом формате .reg / .rgu. - PullRequest
0 голосов
/ 23 мая 2011

Я хочу использовать C # для написания простого хранителя значений реестра для устройства WindowsMobile PPC, чтобы помочь людям сохранять выбранные значения реестра и восстанавливать их после повреждения или HardReset. Моя идея состояла в том, чтобы проанализировать выбранные ключи / значения реестра и сохранить их в обычном файле .reg, который затем может быть импортирован любым редактором реестра.

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

Ооо, я бы хотел начать примерно так:

RegistryKey RgKey = Registry.LocalMachine.OpenSubKey("\Time")
string RgName = "TimeZoneInformation"

string ValueType = Convert.ToString(RgKey.GetValueKind(RgName));
object Value = RgKey.GetValue(RgName);

И «преобразовать» объект Value (который, конечно, сохраняется в массиве System.byte []) в нечто подобное (я использую массив string [] для хранения значений, а после тестирования исключений я помещаю их в файл , но вы можете предложить лучший способ):

[HKEY_LOCAL_MACHINE \ время] "TimeZoneInformation" = шестигранной: c4, и далее, и далее, и далее, 45,00,75,00,72,00,6f, 00,70,00,61,00,20, \ 00,5a, 01,72,00,6f, 00,64,00,6b, 00,6f, 00,77,00,61,00,20,00,28,00,63,00,7a, 00, 61 \ 00,73,00,20,00,73,00,74,00,61,00,6e, 00,64,00,2e, 00,29,00,00,00,00,00,00,00, 00, \ 00,0a, 00,00,00,05,00,03,00,00,00,00,00,00,00,00,00,00,00,45,00,75,00,72,00, 6f, \ 00,70,00,61,00,20,00,5a, 01,72,00,6f, 00,64,00,6b, 00,6f, 00,77,00,61,00,20,00, 28, \ 00,63,00,7a, 00,61,00,73,00,20,00,6c, 00,65,00,74,00,6e, 00,69,00,29,00,00,00, 00, \ 00,00,00,00,00,00,00,03,00,00,00,05,00,02,00,00,00,00,00,00,00, c4, и далее, и далее, и далее

Можно ли сделать это легко? Я не мог найти никакой помощи в этом. Тем более, что я точно не знаю, почему строки в цитируемом примере (экспортированные редактором реестра) имеют этот определенный формат. Но я попытался немного позаботиться об этом, и только этот формат с обратными слешами в конце каждой строки работает, когда фактически вводится в реестр ...

Ответы [ 2 ]

0 голосов
/ 02 декабря 2016

Шестнадцатеричные значения могут быть любого формата, но существует 13 предопределенных известных шестнадцатеричных форматов, таких как hex (5), который является REG_DWORD_BIG_ENDIAN, чтобы декодировать все эти шестнадцатеричные значения, используйте RegtoText , единственный инструмент для декодирования всехшестнадцатеричные значения.

0 голосов
/ 31 мая 2011

После нескольких ночей размышлений (возможно, я просто недостаточно умен, чтобы делать это раньше), я понял, что это вопрос форматирования строки, а не ее преобразования. И вот что я сделал:

 RegistryKey RgKey = Registry.LocalMachine.OpenSubKey("\\Time");
 string RgName = "Time";
 string Txt = null;
 string Tmp = null;
     byte[] data = (byte[])RgKey.GetValue(RgName);
     for (int i = 0; i < data.Length; i++)
     {
     if (i % 24 == 0)
         Tmp = Tmp + "\\\n";
     Tmp = Tmp + String.Format("{0:X2}", data[i]);
     if (i < data.Length - 1)
         Tmp = Tmp + ",";
     }
     Txt = RgName + "=hex:" + Tmp;
     break;

Это было проще, чем я думал. Я надеюсь, что это пригодится кому-то еще.

...