繁体   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