Member 13143502 Ответов: 2

Vb.net -преобразование строки шестнадцатеричных значений в ASCII


Доброе Утро! У меня есть проект, который в основном захватывает мое имя персонажа из запущенного процесса с помощью ReadProcessMemory и возвращает значения в виде шестнадцатеричного кода. У меня возникли проблемы с преобразованием этой строки шестнадцатеричных значений в символы Ascii... Пример Ниже!

Значение, которое я возвращаю:
4d-79-4e-61-6d-65-31-00-00-00
(обратите внимание на ограничение в 10 символов в Соглашении об именовании ... т. е.: 00-00-00)

То, что я на самом деле ищу:
MyName1


Dim Name As String = _memManager.ReadString(BaseAddr - &H1D0)


Public Function ReadString(ByVal addr As IntPtr) As String
    'Int32 data type-- is 32 bits long, 4 bytes.
    Dim _dataBytes(10) As Byte
    ReadProcessMemory(_targetProcessHandle, addr, _dataBytes, 10, vbNull)
    Return BitConverter.ToString(_dataBytes, 0)
End Function


Что я уже пробовал:

Я пробовал несколько предложений в интернете, таких как hex2ascii и .tostring, но безуспешно!

2 Ответов

Рейтинг:
12

Member 13143502

Я смог решить эту проблему, изменив функцию GetBytes

Public Function ReadString(ByVal addr As IntPtr) As String
    'Int32 data type-- is 32 bits long, 4 bytes.
    Dim _dataBytes(10) As Byte
    ReadProcessMemory(_targetProcessHandle, addr, _dataBytes, 10, vbNull)
    Return System.Text.Encoding.Default.GetString(_dataBytes)
End Function


Рейтинг:
0

OriginalGriff

Это зависит от того, что именно вы получаете: если это байты 4d, 79, 4e, ... то это довольно просто:

Dim s As String = System.Text.Encoding.UTF8.GetString(_dataBytes)

Если это строка: "4d-79-4e-61-6d-65-31-00-00-00" тогда это сложнее: сначала преобразуйте это в байты, а затем преобразуйте байты в строку:
Public Shared Function GetBytes(value As String) As Byte()
	Return Array.ConvertAll(value.Split("-"C), Function(s) Byte.Parse(s, System.Globalization.NumberStyles.HexNumber))
End Function


Member 13143502

Значение, возвращаемое моей функцией:

Dim Name As String = _memManager.ReadString(BaseAddr - &H1D0)


Возвращает это значение:
4А-6Е-65-4Д-61-6Г-6Д-61-44-58-00

фактический текст:
JoeMammaDX

OriginalGriff

Поэтому передайте его в функцию GetBytes, которую я вам дал, а затем преобразуйте его в строку с помощью GetString.