C# Reg_Binary и BATCH

Я фанат BATCH, и я пытаюсь реализовать свой ключ, используя C# winForms вместо пакета.

Я сделал простой пакетный скрипт:

@echo off
reg add "HKEY_CURRENT_USER\Software\TestProgram\Kool" /f /v "Setting" /t REG_BINARY /d h4h999d27e93f3666188231a018c9d44406136wb 1>nul 2>&1

Что обновляет мой регистрационный ключ, не о чем беспокоиться. Однако я хочу попытаться реализовать тот же результат с помощью C# WinForms, и я считаю, что у меня есть правильная формула, но результат неверен.

Я пробовал следующее (предварительно проверив, существует ли reg_binary и сначала удалив его):

    private void button1_Click(object sender, EventArgs e)
    {
        if (Registry.GetValue(@"HKEY_CURRENT_USER\Software\TestProgram\Kool", "Setting", null) == null)
        {
            RegistryKey key = Registry.CurrentUser.CreateSubKey(@"Software\TestProgram\Kool");
            try
            {
                var data = Encoding.Unicode.GetBytes("h4h999d27e93f3666188231a018c9d44406136wb");
                //Storing the values
                key.SetValue("Setting", data, RegistryValueKind.Binary);
            }
            catch (Exception exc)
            {
                MessageBox.Show(exc.Message);
                MessageBox.Show(exc.StackTrace);
            }
            key.Close();

            MessageBox.Show("binary key created");
        }
    else
        {
             MessageBox.Show("error");
        }
   }

Что делает ключ не беспокоит, но его формат или результат не тот, что я получаю, когда я делаю это через пакетную обработку, может ли кто-нибудь объяснить мне, почему? Я добиваюсь того же результата, что и при использовании командного файла.

Я чувствую, что мне не хватает чего-то простого, может быть, это неправильные байты, я просто не могу с этим справиться.

Я прочитал их для помощи: Записать шестнадцатеричный блок в формате строки в реестр в двоичном форматеКак получить значение REG_BINARY из реестра и преобразовать его в строкуКак я могу прочитать двоичные данные из реестра в байтовый массивПрочитать Registry_binary и преобразовать в строку

Но все равно безуспешно.

h4h999d27e93f3666188231a018c9d44406136wb не является допустимым шестнадцатеричным значением
Reza Aghaei 11.06.2018 08:23
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
369
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы создать двоичный ключ, вам необходимо передать byte[]. Таким образом, вы должны сначала преобразовать шестнадцатеричную строку в массив байтов, а затем добавить значение.

Например:

var path = @"Software\TestProgram\Kool";
var key = Registry.CurrentUser.OpenSubKey(path, true);
if (key == null)
    key = Registry.CurrentUser.CreateSubKey(path, true);
var hex = "d5d000d27e93f3116100224a018c9d00406136c3";
var value = StringToByteArray(hex);
key.SetValue("Setting", value, RegistryValueKind.Binary);

Я использовал метод StringToByteArray, которым JaredPar поделился в эта почта:

public static byte[] StringToByteArray(string hex) {
    return Enumerable.Range(0, hex.Length)
                     .Where(x => x % 2 == 0)
                     .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
                     .ToArray();
}

Итак, есть ли причина, почему в BATCH он работает без преобразования шестнадцатеричного значения? Подобная партия автоматически преобразует шестнадцатеричный код в байт.

Burgo855 11.06.2018 09:03
d5d000d27e93f3116100224a018c9d00406136c3 будет обрабатываться командой reg add как шестнадцатеричное значение. Но вот C# вам нужно передать как byte[].
Reza Aghaei 11.06.2018 09:07

Другие вопросы по теме