Vb.net 在文件中查找特定值

Vb.net 在文件中查找特定值,vb.net,Vb.net,我正在尝试制作一个简单的程序来查找文件中的一些值。这些文件是.arkprofile文件,属于游戏 这些.arkprofile文件包括一些可读文本以及一些加扰文本(如果在常规编辑器中打开)。我需要的所有值都是ASCII格式的,因此我可以手动获取所有值,但是这个程序的目的是遍历大量文件以提取字符名。以下是它在常规文本编辑器的文件中的外观: PlayerCharacterName.....StrProperty.............CHARACTERNAMEHERE PlayerCharacter

我正在尝试制作一个简单的程序来查找文件中的一些值。这些文件是
.arkprofile
文件,属于游戏

这些.arkprofile文件包括一些可读文本以及一些加扰文本(如果在常规编辑器中打开)。我需要的所有值都是ASCII格式的,因此我可以手动获取所有值,但是这个程序的目的是遍历大量文件以提取字符名。以下是它在常规文本编辑器的文件中的外观:

PlayerCharacterName.....StrProperty.............CHARACTERNAMEHERE PlayerCharacterName…..StrProperty…..CharacterName此处 我能在不先将文件反编译为十六进制的情况下找到这个字符串吗?是否可以将字符串转换为字节并从中进行搜索

这是我目前拥有的代码,但它不适合我的需要,因为字符串的十六进制偏移量对于所有文件都不相同

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
Dim pos1长度=864
整数形式的Dim requiredBytes=160
Dim值(0到requiredBytes-1)作为字节
将读取器用作新的二进制读取器(File.Open(fd.FileName,FileMode.Open))
'循环文件的长度。
Dim fileLength As Long=reader.BaseStream.Length
Dim字节计数为整数=0
reader.BaseStream.Seek(位置1,SeekOrigin.Begin)
而pos1
字符串之间的点会随着文件的不同而改变十六进制值,但点的数量总是相同的。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
Fieeaher6QM2SWY38TKyo
i7diJRVGiZJUZHx26URbCwsewhby3NhPLMSMOv
w51Ft4I8aK2bjdu0OmzD3V5tDjlXnCXGfTk1NqAE
PlayerCharacterName…..StrProperty…..CharacterName此处
J4H73RcfdMVHkLIaXv
Yo5TCC6MmnkA51BZJcrCkzj62xucQ
8TR1QFSL1RDMF2SCJJLOKTHYHNA2SUBK
1FBPWSK8AQWDFY1H9TKHSR
KLBQVNHUILDCB1EXXJGWZTQH37JZU2OXOHUCHRF2BPKSKMLZYF055Q5
ly0WxwtFP47BE0BAVD1sfWBogFR0Qb9r3DKBWiinRk9xLitqT
g5FgAyCQ5P7v3Z9hz04hQR1KU1SuoscYH7s5SYbHV1mJEnJKIb0

这是我程序的输出:

找到名称“CHARACTERNAMEHERE”


因为您可以在文本编辑器中读取它,所以只需将其作为文本文件打开即可

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
Fieeaher6QM2SWY38TKyo
i7diJRVGiZJUZHx26URbCwsewhby3NhPLMSMOv
w51Ft4I8aK2bjdu0OmzD3V5tDjlXnCXGfTk1NqAE
PlayerCharacterName…..StrProperty…..CharacterName此处
J4H73RcfdMVHkLIaXv
Yo5TCC6MmnkA51BZJcrCkzj62xucQ
8TR1QFSL1RDMF2SCJJLOKTHYHNA2SUBK
1FBPWSK8AQWDFY1H9TKHSR
KLBQVNHUILDCB1EXXJGWZTQH37JZU2OXOHUCHRF2BPKSKMLZYF055Q5
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或real sample数据),以及一些不可打印的字符是否会产生意外的换行符或多字节字符。

这听起来像是正则表达式的工作:

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或real sample数据),以及一些不可打印的字符是否会产生意外的换行符或多字节字符。

如果其中一些字符是人类可读的,然后,您可以将文件作为文本打开,只需找到字符串即可。正在编辑此文章。此网站及其设置的新功能!下面是我的答案当你说字符名使用ASCII字符时,这是严格正确的吗?你能说出一个角色的名字吗,比如“ÛǾ”▲" 然后查看文本文件中显示的内容?您最好在十六进制编辑器中查看文本文件,这样您就可以确定使用了多少字节,而不是文本编辑器将字符解释为什么。如果其中一些字符是人类可读的,那么您可以将文件作为文本打开,然后只找到字符串。正在编辑此文章。新到是站点和它的设置!看到我下面的答案了吗?当你说字符名使用ASCII字符时,这是严格正确的吗?你能说出一个字符的名字吗,比如说“ÛǾ”▲“并查看文本文件中显示的内容?您最好在十六进制编辑器中查看文本文件,以便确定使用了多少字节,而不是文本编辑器将字符解释为什么。感谢您的回复!我将对代码进行一些处理,看看是否可以使其正常工作。通过运行您发布的代码,我可以请注意,它确实在程序中找到了字符串,但它写入了一个完全不同的值。我曾尝试在文本框中以文本形式打开该文件,但无论我做什么,最终都只会得到一个乱码字符。如果该文件不是.txt文件,有什么具体的方法可以做到这一点吗?好的,最后,文件只是磁盘上的一个位置,其中包含一些东西。Everything保存为二进制。它可能是表示某些自定义对象的位,也可能是表示ASCII字符的位。您可以将二进制文件作为文本打开,查看这些位是否表示任何人类可读的内容。似乎游戏的开发人员将其中的字符名编码为文本,而