将字节数组写入内存流只会写入零?

时间:2010-01-16 11:06:11

标签: arrays vb.net

我已尝试多次重写此代码,它正确地吐出了字节,但是当尝试读取从内存流创建的数组时,它是空的,我做错了什么?

Dim bytes() As Byte = System.Text.Encoding.ASCII.GetBytes("test this code")
Dim bytesString As String = ""
Dim i As Integer = 0
i = 0
Dim byteStream As New System.IO.MemoryStream
Do While i < bytes.Length
    If bytes(i).ToString <> 0 Then
        bytesString = bytesString & "|" & bytes(i).ToString
        byteStream.WriteByte(bytes(i))
        Debug.Print(bytes(i).ToString)
    End If
    i = i + 1
Loop
i = 0
byteStream.Flush()
Dim newBytes(byteStream.Length - 1) As Byte
byteStream.Read(newBytes, 0, byteStream.Length)
byteStream.Close()
Dim stringData As String = System.Text.Encoding.ASCII.GetString(newBytes)
Debug.Print("Data: " & stringData)

2 个答案:

答案 0 :(得分:2)

在阅读之前,你没有倒回流:

byteStream.Position = 0

(就在致电Read之前。)

基本上你实际上并没有读取任何数据,因为当你拨打Read时,流会定位在最后。

这是你应该检查Read的返回值的另一个原因......它将返回0,这会给你一个提示。

(我也不清楚为什么你要将每个字节转换成字符串,然后将它与整数进行比较......这段代码真正意味着做什么?)

答案 1 :(得分:2)

我会发布这个作为探索一些替代方案的答案:

如果您只想将数据从一个数组复制到另一个数组,则不必使用流。只是做:

Dim newBytes(23) As Byte
Array.Copy(bytes, 3, newBytes, 0, 24)

(注意,字节3到26不是23个字节,因为很容易被人误解,但是24.声明newBytes(23)会给你一个索引最高值为23且因此长度为24的数组。)

您也可以一次只复制一个字节:

Dim newBytes(23) As Byte
For i As Integer = 0 To newBytes.Length - 1
   newBytes(i) = bytes(i + 3)
Next

另一个选项(虽然效率不高但很容易理解)是使用LINQ方法获取字节并转换为数组:

Dim newBytes As Byte() = bytes.Skip(3).Take(24).ToArray()