2011-02-11 6 views
3

int32, int16, 단일 값을 포함하는 메모리 스트림을 만들고 싶습니다. binarywriter를 사용하여 쓸모가 없으므로 바이트 배열을 만들려고했습니다. 값이 다른 유형이므로 값을 올바르게 처리하는 방법을 알지 못합니다. 그래서 나는 그렇게 할 시도 :다른 유형의 데이터가있는 bytes 배열의 MemoryStream

byte[] tab = new byte[]{2,0,0,0,3,0,3,0} - 다른 두 개의 3 INT16 (두 바이트)되어, 2 (4 바이트)이 int32되고 잘 작동하지만 난 어떤 하나의 값을 추가 할 때, 그것은 생성

오류. 나는 그렇게 할 캔트 :

byte[] tab = new byte[]{2,0,0,0,3,0,3,0,4.4f,5.6f}

은 그 스트림이 방법으로 읽을 수 있습니다 원인이 적절한 형식으로 스트림이 있어야합니다

short[] rawData; 
float[] modulusData; 
    public void rawData(Stream s) 
     { 

      BinaryReader br = new BinaryReader(s); 

      int dataCount = br.ReadInt32(); 

      if (dataCount > 0) 
      { 
       rawData = new short[dataCount]; 
       for (int i = 0; i < dataCount; i++) 
        rawData[i] = br.ReadInt16(); 
      } 
      else 
       rawData = new short[0]; 

      dataCount = br.ReadInt32(); 

      if (dataCount > 0) 
      { 
       modulusData = new float[dataCount]; 
       for (int i = 0; i < dataCount; i++) 
        modulusData[i] = br.ReadSingle(); 
      } 
      else 
       modulusData = new float[0]; 
     } 

누구 어떻게 그렇게 할 생각이있다?

+0

당신이지고 어떤 오류 (다른 답변을 참조) 사용하여 읽기 같은 방법으로 스트림에 작성하는 것입니다? –

+0

더 중요한 것은 - 이것은 무엇을하기로되어 있습니까? 형식에 대한 스펙이 있습니까? 현재 스트림에서 일부 숫자를 읽고 해당 정보를 사용하여 독자를 발전시키고 다음에 읽을 내용을 선택합니다. 귀하의 데이터가 형식에 대해 유효하지 않은 것 같습니다 (rawData 메서드가 실제로 제공되는대로 제공되는 경우). – Goran

답변

5

원래 진술과 반대로 BinaryWriter정확히입니다. 그게 바로 그것의 목적입니다. 특히, 나중에 BinaryReader을 사용하려는 경우에 적합합니다.

당신이 그것을 사용하지 않는 이유 당신은 언급하지 않은,하지만 정말 당신이 사용해야하는 것입니다 :

[Int32 ] [Int16] [Int16] [Single ] [Single ] 
02 00 00 00 03 00 03 00 CD CC 8C 40 33 33 B3 40 
:

using (MemoryStream stream = new MemoryStream()) 
{ 
    using (BinaryWriter writer = new BinaryWriter(stream)) 
    { 
     writer.Write(2); 
     writer.Write((short) 3); 
     writer.Write((short) 3); 
     writer.Write(4.4f); 
     writer.Write(5.6f); 
    } 
    byte[] bytes = stream.ToArray(); 
} 

이것은 다음과 같은 데이터를 바이트 배열을 생성

한 점은주의해야 - 당신의 쓰기 설명을 다음 값 기록 :

- Int32 
- Int16 
- Int16 
- Single 
- Single 
,536,913,632을 10

...하지만 읽기 코드를 읽습니다 : BinaryWriter와 이전의 시도들이 내 초기 코드처럼 보였다 때문에 실패한다면 당신은

writer.Write(2); 
을 잊었 때문에 즉

- Int32 (value 2) 
- Int16 
- Int16 
- Int32 (this wasn't written - so you're reading data from the first Single!) 
- ??? 

, 그것은이다

Int16 값을 작성한 후 몇 개의 Single 값이 있었는지 말할 수 있습니다.

바이트 배열로 값을 필요로하지 않으면 ToArray을 호출 할 필요가 없습니다. 스트림을 처리하지 않고 반환하면됩니다. 그러나, 그것을 읽기 전에 "되감기"를 원할 것입니다. 예 :

public Stream GetData() 
{ 
    MemoryStream stream = new MemoryStream(); 
    BinaryWriter writer = new BinaryWriter(stream); // Don't close at the end! 
    writer.Write(2); 
    writer.Write((short) 3); 
    writer.Write((short) 3); 
    writer.Write(2); // Extra count for the Single values 
    writer.Write(4.4f); 
    writer.Write(5.6f); 
    writer.Flush(); // May not be required... 

    stream.Position = 0; // Rewind so stream can be read again 
    return stream; 
} 
3

BinaryWriter는 전혀 쓸모가 없습니다. memorystream을 작성하고 쓰기 만하면됩니다.

MemoryStream m = new MemoryStream(); 
using (BinaryWriter writer = new BinaryWriter(m)) { 
    writer.Write(2); // count 
    writer.Write((short)3); 
    writer.Write((short)3); 
    writer.Write(2); // count 
    writer.Write(4.4f); 
    writer.Write(5.6f); 
} 
byte[] tab = m.ToArray(); 

또한 float 값의 수를 추가했습니다. 그것은 예제 데이터에는 없지만 데이터를 읽는 메서드는이를 필요로합니다.

데이터를 올바르게 읽을 수 있는지 확인했습니다.나는 당신의 독자 코드를 사용하고, 그 결과를 썼다 :

Console.WriteLine(rawData.Length); 
foreach (short x in rawData) Console.WriteLine(x); 
Console.WriteLine(modulusData.Length); 
foreach (float f in modulusData) Console.WriteLine(f); 

출력 : Int32Int16 암시 byte로 변환되기 때문에

2 
3 
3 
2 
4,4 
5,6 
0

는이 같은 바이트 배열이 작동하지 않습니다 구축 부동 소수점 숫자에 대해서는 발생하지 않으므로 컴파일러 오류가 발생합니다.

가장 좋은 방법은 당신이 BinaryWriter