[英]Finding a specific value in a file
我正在嘗試創建一個簡單的程序來查找文件中的某些值。 這些文件是.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格式顯示。
我在這里偏離軌道嗎?
由於您可以在文本編輯器中閱讀它,因此您只需將其作為文本文件打開即可。
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
8TR1QfSL1IRdmF2ScjjlokTHYHNa2suBk
1FBphwSK8aQWdfY1H9tKHSr
kLbQvNhUhILdcBv1EXXJgwZtQh37JZu2oXoHuCHRf2bpKsKmlZyf055Q5
ly0WxwtFP47BE0BAVD1sfWBogFR0Qb9r3DKBWiinRk9xLitqT
g5FgAyCQ5P7v3Z9hz04hQR1KU1SuoscYH7s5SYbHV1mJEnJKIb0
這是我的程序的輸出:
找到的名字“CHARACTERNAMEHERE”
這聽起來像是正則表達式的工作:
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或實際樣本數據)以及某些不可打印的字符是否會產生意外的換行符或多字節字符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.