从null终止的字节数组

时间:2015-12-16 07:07:24

标签: vb.net string null bytearray

直到我陷入困境为止,这是发生的事情:

  1. 选择了一个文件,然后使用System.IO.File.ReadAllBytes(filename)

  2. 读入一个字节数组
  3. 字节数组包含压缩数据,解压缩并再次存储在字节数组中

  4. 现在未压缩的数据包含一个看似空终止的文本块。代替"。" as& H0看起来像"

  5. 一些随机文本。更随机的文本。更随机的文本。

    文件中的部分数据确实为我提供了每个块的起始位置。 (例如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

1 个答案:

答案 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