2010-01-16 1 views
0

이 코드를 여러 번 다시 쓰려고 시도했지만 올바르게 바이트를 뱉어 냈지만 메모리 스트림에서 만든 배열을 읽으려고하면 비어 있습니다. 왜 내가 잘못 했습니까? 당신은 스트림을 되감기하지 않을memorystream에 바이트 배열을 쓰면 쓰여지는 값이 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

+0

@fMinkel : 정말로 새로운 배열로 가져와야합니까? 처음 세 바이트는 사용할 수 없습니까? Array.Copy를 사용하여 데이터를 새 배열에 복사하는 방법을 고려 했습니까? – Guffa

+0

Guffa, Copy 및 CopyTo를 사용하여 시도했지만 원본 배열의 중간 부분을 사용하는 방법을 알아 내지 못했습니다 (수천 개의 요소가 될 수있는 배열의 3-26) – fMinkel

2

I

데이터를 한 배열에서 다른 배열로 복사하려는 경우 스트림을 사용할 필요가 없습니다. 하나는 쉽게 생각에 속지대로

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

가 (, 26을 통해 3이 아닌 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() 
관련 문제