2016-10-20 5 views
1

Я пытаюсь создать простую программу, чтобы найти некоторые значения в файле. Эти файлы - .arkprofile и относятся к игре ARK.Поиск определенного значения в файле

Эти файлы .arkprofile содержат некоторый читаемый текст, а также некоторый скремблированный текст, если вы открываете его в обычном редакторе. Все значения, которые мне нужны, находятся в ASCII, поэтому я могу получить их все вручную, но цель этой программы состоит в том, чтобы пройти через множество файлов, чтобы захватить имена символов. Вот как это выглядит в файле в обычном текстовом редакторе:

PlayerCharacterName.....StrProperty.............CHARACTERNAMEHERE

Могу ли я найти эту строку без декомпиляции файла в шестнадцатеричном формате в первую очередь? Можно ли преобразовать строку в байты и выполнить поиск?

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

Dim pos1 As Long = 864 

Dim requiredBytes As Integer = 160 
Dim value(0 To requiredBytes - 1) As Byte 
Using reader As New BinaryReader(File.Open(fd.FileName, FileMode.Open)) 
    ' Loop through length of file. 
    Dim fileLength As Long = reader.BaseStream.Length 
    Dim byteCount As Integer = 0 
    reader.BaseStream.Seek(pos1, SeekOrigin.Begin) 
    While pos1 < fileLength And byteCount < requiredBytes 
     value(byteCount) = reader.ReadByte() 
     pos1 += 1 
     byteCount += 1 
    End While 
End Using 

Точки между строками изменить шестнадцатиричное значение из файла в файл, но его всегда одинаковое количество точек. Максимальное имя символа, разрешенное для ARK, равно 24, поэтому теперь моя идея - сначала найти эту строку в файле, начать писать байты с конца этого файла на 128 байт. «PlayerCharacterName ..... StrProperty .............» = 60 байт. Здесь будет начинаться имя пользователя и может содержать до 24 символов длиной 48 байт. Затем я мог бы отфильтровать оставшиеся символы, которые не являются частью имени пользователя и отображают его в ASCII.

Есть ли здесь путь отсюда?

+0

Если некоторые из них доступны для чтения, вы можете открыть файл в виде текста и просто найти строку. – djv

+0

Работа над редактированием этого сообщения. Новое на этом сайте и его настройка! –

+0

См. Мой ответ ниже – djv

ответ

0

Это звучит как работа для регулярного выражения:

Public Function GetCharacterName(ByVal filePath As String) As String 
    Dim exp As New RegEx("PlayerCharacterName.{5}StrProperty.{13}(.{1,24})") 
    For Each line As String In File.ReadLines(filePath) 
     Dim result = exp.Match(line) 
     If result.Success Then 
      Return result.Groups(1).Value 
     End If 
    Next line 
    Return Nothing 
End Function 

Моя единственная забота с этим построен ли я правильно выражение (у меня не было Visual Studio или реальные образцы данных) и могут ли некоторые из непечатаемых символов создавать неожиданный символ новой строки или многобайтовый символ.

+0

Спасибо всем! Код из @JoelCoehoorn, похоже, работает именно так, как я хочу, для большинства файлов. Некоторые файлы становятся пустыми, но я верю, что смогу заставить его работать. –

+0

@JaranBjortomt Вы должны изучить файлы, в которых результат получается пустым с шестнадцатеричным редактором, чтобы увидеть, что в нем отличается. В крайнем случае вы можете использовать VS: [Могу ли я отредактировать файл в Visual Studio?] (Http://stackoverflow.com/a/1724591/1115360) –

+0

Уже на нем. Спасибо, спасибо. –

0

Поскольку вы можете прочитать его в текстовом редакторе, вы можете просто открыть его в виде текстового файла.

Imports System.IO 

Module Module1 

    Sub Main() 
     Dim line As String = "" 
     Using sr As New StreamReader("c:\temp\test.abc") 
      While Not sr.EndOfStream 
       line = sr.ReadLine() 
       If line.StartsWith("PlayerCharacterName") Then 
        Exit While 
       End If 
      End While 
     End Using 
     If line = "" Then 
      Console.WriteLine("Did not find the name!") 
     Else 
      Dim s = line.Split("."c) 
      Dim name = s.Last() 
      Console.WriteLine("Found name ""{0}""", name) 
     End If 
     Console.Read() 
    End Sub 

End Module 

Я поставил файл на номер c:\temp\test.abc для проверки. При этом в нем:

5tmodvVa640xaDv0fZ650R85uWo0R
CqwhYMD9e8h
FIEeAHhER6Qm2sWY38tKYO
i7diJRVGiZJUZHx26URbCwsewhby3NhPLMSMOv
w51Ft4I8aK2bjdu0OmzD3V5tDjlXnCXGfTk1NqAE
PlayerCharacterName ..... StrProperty .............CHARACTERNAMEHERE
J4H73RcfdMVHkLIaXv
Yo5TCC6MmnkA51BZJcrCkzj62xucQ TR1QfSL1IRdmF2ScjjlokTHYHNa2suBk
1FBphwSK8aQWdfY1H9tKHSr
kLbQvNhUhILdcBv1EXXJgwZtQh37JZu2oXoHuCHRf2bpKsKmlZyf055Q5
ly0WxwtFP47BE0BAVD1sfWBogFR0Qb9r3DKBWiinRk9xLitqT
g5FgAyCQ5P7v3Z9hz04hQR1KU1SuoscYH7s5SYbHV1mJEnJKIb0

И это был выход моей программы:

Найдено название «CHARACTERNAMEHERE»

+0

Спасибо за ваш ответ! Я немного поиграю с кодом, чтобы посмотреть, смогу ли я заставить его работать. Запустив код, который вы опубликовали, я вижу, что он находит строку в программе, но он записывает atotally diffrent значение. Я попытался открыть файл как текст в текстовом поле, но все, что у меня есть, только с одним скругленным персонажем. Есть ли какой-либо конкретный способ сделать это, если файл не является .txt-файлом? –

+0

Ну, в конце концов, файл - это просто место на диске с * something * в нем. Все сохраняется как двоичный. Это могут быть биты, которые представляют собой некоторый пользовательский объект или биты, которые представляют символы ASCII. Вы можете открыть двоичный файл в виде текста и посмотреть, означают ли биты что-либо, что можно прочитать человеком. Похоже, что разработчики вашей игры закодировали имена символов там как текст, который хорош для вас. Я изменил ответ на использование файла test.abc, и он по-прежнему работает. Это показывает, что нет ничего мистического в расширении .txt. В конце концов, это всего лишь двоичные данные. Все дело в кодировке. – djv

+1

@JaranBjortomt Точки, как представляется, представляют символы, которые текстовый редактор OP не может отобразить - возможно, разложение в регулярном выражении на [\ x00- \ x1F] будет работать. –

Смежные вопросы