2010-01-16 43 views
0

我試過多次重寫這段代碼,它正確地吐出了字節,但是當試圖讀取從內存流創建的數組時,它是空的,我做錯了什麼?將字節數組寫入存儲器流只會產生寫入的零?

Dim bytes() As Byte = System.Text.Encoding.ASCII.GetBytes("test this shit") 
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) 

回答

1

你不倒帶流之前,先閱讀:

byteStream.Position = 0 

(就在調用Read。)

基本上你實際上並不讀取任何數據,這是因爲當您撥打Read時,流定位在最後。

這是你爲什麼要檢查返回值Read的另一個原因......它會返回0,這會給你一個提示。

(它也並不清楚,我爲什麼你每個字節轉換成字符串,然後將其與一個整數比較...這是什麼代碼真正的意思是做?)

+0

我想讀取tcp數據,我得到的是一個字節數組(顯然),但我只對字節3到26感興趣,這是我能想到的最好的方法來獲取這些字節成一個新的字節數組。 – fMinkel 2010-01-16 11:22:44

+0

@fMinkel:你真的必須讓他們進入一個新的數組,你不能不使用前三個字節嗎?你有沒有考慮過使用Array.Copy將數據複製到新數組? – Guffa 2010-01-16 11:37:17

+0

Guffa,我曾嘗試使用Copy和CopyTo,但我無法弄清楚如何使用源數組中的中間,(可能有數千個元素的數組中的3-26) – fMinkel 2010-01-16 11:41:37

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 

另一種選擇(這是不是很efficent但短期和易於理解的)是使用LINQ方法獲取字節並轉換爲數組:

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