簡體   English   中英

在文件中查找特定值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM