Я фанат 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 и преобразовать в строку
Но все равно безуспешно.





Чтобы создать двоичный ключ, вам необходимо передать 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 он работает без преобразования шестнадцатеричного значения? Подобная партия автоматически преобразует шестнадцатеричный код в байт.
d5d000d27e93f3116100224a018c9d00406136c3 будет обрабатываться командой reg add как шестнадцатеричное значение. Но вот C# вам нужно передать как byte[].
h4h999d27e93f3666188231a018c9d44406136wbне является допустимым шестнадцатеричным значением