powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Преобразование hex string в массив байт и обратно
8 сообщений из 8, страница 1 из 1
Преобразование hex string в массив байт и обратно
    #39621655
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтение-запись из реестра REG_BINARY.
В .reg-файле пишется так например:
"EditFlags"=hex:02,00,00,00
Функции ввода-вывода из реестра принимают-отдают надо думать byte()
Т.е. нужно преобразование "02,00,00,00"->byte() и обратно byte() ->"02,00,00,00"
Ну либо "02000000"->byte() и обратно byte() ->"02000000"
С форматом hex строки пока не определился,
надо посмотреть что в реестре, сравнить с тем что должно быть (это можно подсмотреть-скопировать из reg-файла как строку, запятые можно в принципе убрать), если не совпадает то записать

Т.е. даю на вход своей ф-ции строку, кот. надо сравнить-записать.

Какой-нибудь удобный способ?

А то начал гуглить, народ какие-то там ф-ции сочиняет (аля простыни), типа for next mid, step 2.
...
Рейтинг: 0 / 0
Преобразование hex string в массив байт и обратно
    #39621669
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот уж не знаю, что там за писатели, ухитряющиеся на эту тему сочинять простыни.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
var data = new byte[] {25, 31, 117, 3, 19, 55, 200};
var hex = BitConverter.ToString(data).Replace("-", string.Empty);
Console.WriteLine(hex);
var data2 = Enumerable.Range(0, hex.Length)
  .Where(x => x % 2 == 0)
  .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
  .ToArray();
foreach(var b in data2)
  Console.WriteLine(b);


Вывод:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
191F75031337C8
25
31
117
3
19
55
200
...
Рейтинг: 0 / 0
Преобразование hex string в массив байт и обратно
    #39622214
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

Счас буду пробовать, но C#->VB.Net конвертер с кодом не справился (иногда пользуюсь когда не очень понимаю).

И еще, с .Net 2.0 код совместим? (то что нужно сейчас будет только в .Net 4.5 но я привык писать совместимые коды)
...
Рейтинг: 0 / 0
Преобразование hex string в массив байт и обратно
    #39622242
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

Ну, с переводом справился (запятая-разделитель наверно оптимальна в моем случае)
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
  Private Sub ButtonTestBinary_Click(sender As Object, e As EventArgs) Handles ButtonTestBinary.Click
    Dim data As Byte() = New Byte() {25, 31, 117, 3, 19, 55, 200}
    Dim Hex As String = BitConverter.ToString(data).Replace("-", ",")
    MsgBox(Hex)
    Dim HexSimple As String = Hex.Replace(",", String.Empty)
    Dim data2 As Byte() = Enumerable.Range(0, HexSimple.Length).Where(Function(x) x Mod 2 = 0).[Select](Function(x) Convert.ToByte(HexSimple.Substring(x, 2), 16)).ToArray()
    Dim strPrint As String = ""
    For Each b As Byte In data2
      strPrint = strPrint & b.ToString & vbCrLf
    Next
    MsgBox(strPrint)
  End Sub



Выделенную строчку можно на что-то заменить (на не длинно и понятно)?
Она с .Net 2.0 несовместима (Linq?), а мне желательно это пихнуть в модуль который подгружается .Net 2.0 совместимыми моими проектами.
...
Рейтинг: 0 / 0
Преобразование hex string в массив байт и обратно
    #39622244
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77
Код: vbnet
1.
Dim data2 As Byte() = Enumerable.Range(0, HexSimple.Length).Where(Function(x) x Mod 2 = 0).[Select](Function(x) Convert.ToByte(HexSimple.Substring(x, 2), 16)).ToArray()



StringBuilder + ForEach
...
Рейтинг: 0 / 0
Преобразование hex string в массив байт и обратно
    #39622288
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
  Private Sub ButtonTestBinary_Click(sender As Object, e As EventArgs) Handles ButtonTestBinary.Click
    Dim data As Byte() = New Byte() {25, 31, 117, 3, 19, 55, 200}
    Dim Hex As String = BitConverter.ToString(Data).Replace("-", ",")
    MsgBox(Hex)

    Dim strMas As String() = Hex.Split({","}, StringSplitOptions.RemoveEmptyEntries)
    Dim data2(UBound(strMas)) As Byte
    For i As Integer = 0 To UBound(strMas)
      data2(i) = Convert.ToByte(strMas(i), 16)
    Next

    Dim strPrint As String = ""
    For Each b As Byte In data2
      strPrint = strPrint & b.ToString & vbCrLf
    Next
    MsgBox(strPrint)
  End Sub


Сойдет?

Если Hex="",то UBound(strMas)=-1, цикл не сработает, data2(-1) это массив без элементов,
обработка ошибок вроде не нужна.
Ну и потом я контролирую, что я туда подкладываю.
...
Рейтинг: 0 / 0
Преобразование hex string в массив байт и обратно
    #39622343
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
В общем-то алгоритм один. Последовательно брать два символа и конвертировать их в byte. Циклом или LINQ - без разницы
...
Рейтинг: 0 / 0
Преобразование hex string в массив байт и обратно
    #39622396
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оформил вышеприведенное как 2 ф-ции

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
  Public Function HexStringToByteArray(ByVal sHexString) As Byte()
    'конвертирует строку в формате hex вида "6d,00,46,00" в массив байтов
    Dim strMas As String() = sHexString.Split({","}, StringSplitOptions.RemoveEmptyEntries)
    Dim data(UBound(strMas)) As Byte
    For i As Integer = 0 To UBound(strMas)
      data(i) = Convert.ToByte(strMas(i), 16)
    Next
    Return data
  End Function

  Public Function ByteArrayToHexString(ByVal data As Byte()) As String
    'конвертирует массив байтов в строку в формате hex вида "6D,00,46,00"
    Return BitConverter.ToString(data).Replace("-", ",")
  End Function



Есть еще момент.
На вход первой ф-ции пофиг в каком регистре подавать строку, при копировании из reg-файла она например в нижнем.
А вот BitConverter.ToString(data) вроде как отдает строго в верхнем
Т.е. при сравнении необходимого (в виде строки) с тем что лежит в реестре, надо приводить к одному регистру
Код: vbnet
1.
2.
        If UCase(sHex) <> UCase(sHexValue) Then
          AddLog("    Error. Invalid value: 'hex:" & sHex & "'")


Вообще конечно с этим REG_BINARY намучился.
C RegQueryValueEx еще непонятка возникла.
Хорошо вспомнил из VB6 что вместо всего массива байтов ByVal data as byte() в lpData надо подсовывать первый элемент data(0), остальные сами волшебно заполняются. Хотя думаю через IntPtr + Marshall тоже можно.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Преобразование hex string в массив байт и обратно
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]