直到我陷入困境为止,这是发生的事情:
选择了一个文件,然后使用System.IO.File.ReadAllBytes(filename)
字节数组包含压缩数据,解压缩并再次存储在字节数组中
现在未压缩的数据包含一个看似空终止的文本块。代替"。" as& H0看起来像"
一些随机文本。更随机的文本。更随机的文本。
文件中的部分数据确实为我提供了每个块的起始位置。 (例如0,17,34等)。读取此文件的c源代码似乎能够处理数据数组中的起始位置,并自动抓取从该位置到(并且可能包括?)& H0值的所有内容。
我试图弄清楚如何在visual basic中执行此操作。我一直在寻找,我能找到的最接近的东西基本上就像是:
MyString = System.Text.Encoding.ASCII.GetString(DataBlock, y, Array.IndexOf(DataBlock, CType(0, [Byte])))
然而这不起作用。这是我得到的例外:
System.ArgumentOutOfRangeException未处理HResult = -2146233086 消息=索引和计数必须引用缓冲区内的位置。 参数名称:bytes ParamName = bytes Source = mscorlib
我尝试了各种尝试指定" 0"然而他们都得到了一个错误。例如,将其更改为" chr(0)"给了我
"需要非负数。参数名称:byteCount"
这么长的故事很短(太迟)如何有效地从字节数组中获取一串用& H0分隔的文本? (最好不使用for / next循环)
更新
对于初学者我有一些错误。 Y从"数据"获得了它的信息。这可能是默认的类.data而不是来自" datablock"这是解压缩的数据。第二,我需要将y值偏移到文本数据开始的位置。所以这段代码:
Console.WriteLine(System.Text.Encoding.ASCII.GetString(DataBlock, BlockData + y, Array.IndexOf(DataBlock, CType(0, [Byte]))))
现在有点工作了。它现在的问题是它只获得预期字符串的前3个字符。例如,字符串white.tga
仅返回whi
答案 0 :(得分:1)
这是我的最终解决方案。它确实有效。 Array.IndexOf有一个重载,允许您指定搜索的起始点
MyClass.Textures(x) = System.Text.Encoding.ASCII.GetString(DataBlock, BlockData + y, Array.IndexOf(DataBlock, CType(0, [Byte]), BlockData + y))
这里包含了一个很好的小功能:
Public Function GetNullTermStr(ByVal ByteArray As Byte(), ByVal Start As Integer) As String
' Gets a null (&H0) terminated string from a ByteArray starting at location Start
Try
Return System.Text.Encoding.ASCII.GetString(ByteArray, Start, Array.IndexOf(ByteArray, CType(0, [Byte]), Start))
Catch ex As Exception
MsgBox(ex.Message)
Return Nothing
End Try
End Function