2008-11-06 4 views
1

장비에서 생성 된 바이너리 로그 파일을 읽는 중입니다.Short로 변환 한 이진 데이터가 유효합니까?

바이트 [] 안에 데이터가 있습니다.

나는 이런 식으로 뭔가를 할 수 짧은 만들기 위해 2 바이트를 읽을 필요가있는 경우 :

short value = (short)(byte[1] << 8); 
value += byte[2]; 

가 지금은 값이 유효한 데이터에 대한 정확한 알고 있습니다.

파일이 망가 졌는지 알 수 있으며 FF FF 값이 바이트 배열의 두 위치에 있다고 말할 수 있습니까?

FF FF를 short로 변환 한 결과 값을 보면 -1이됩니다.

이것은 FF FF의 일반적인 값입니까? 아니면 컴퓨터가 어떤 종류의 짧은 경계를 벗어나 잘못된 데이터로 넘어 갔습니까?

내 목적을 위해 모든 논문 번호는 긍정적 인 것입니다. FF FF가 실제로 짧은 -1이면, 모든 결과가 우월하다는 것을 검증 할 필요가 있습니다.

은 BTW, 내가 다른 숫자 데이터 형식을 읽고있다
키스

, 감사합니다. 나는 그들을 여기에 보여줄 것입니다. Read 함수는 byte []로부터 읽는 기본적인 부분입니다. 다른 모든 데이터 유형 읽기는 기본 Read() 기능을 사용합니다.

public byte Read() 
    { 
     //advance position and then return byte at position 

     byte returnValue; 
     if (_CurrentPosition < _count - 1) 
     { 
      returnValue= _array[_offset + ++_CurrentPosition]; 
      return returnValue; 
     } 
     else 
      throw new System.IO.EndOfStreamException 
        ("Cannot Read Array, at end of stream."); 
    } 


    public float ReadFloat() 
    { 
     byte[] floatTemp = new byte[4]; 
     for (int i = 3; i >= 0; i--) 
     { 
      floatTemp[i] = Read(); 
     } 

     float returnValue = System.BitConverter.ToSingle 
      (floatTemp, 0); 

     if (float.IsNaN(returnValue)) 
     { 
      throw new Execption("Not a Number");  
     } 
     return returnValue; 
    } 


    public short ReadInt16() 
    { 
     short returnValue = (short)(Read() << 8); 
     returnValue += Read(); 
     return returnValue; 
    } 

    public int ReadInt32() 
    { 
     int returnValue = Read() << 24; 
     returnValue += Read() << 16; 
     returnValue += Read() << 8; 
     returnValue += Read(); 
     return returnValue; 
    } 

답변

3

0xffff (모든 비트는 1과 같음)은 서명 된 반바지에 대해 -1이며, 예입니다. 자세한 내용은 Two's complement을 읽어보십시오. 더 큰 데이터 유형으로 전환하거나 (Grzenio가 제안한 것처럼) 부호없는 유형 만 사용하면됩니다.

+0

2의 보수에 대한 멋진 정보. http://en.wikipedia.org/wiki/Twos_complement –

1

ushort (unsigned short)를 사용해 보셨습니까?

0

"짧은"에 대한 FFFF의 값은 -1하지만, "서명되지 않은 짧은"에 대한 FFFF의 값은 당신이 경우 서명되지 않은 짧은을 사용하고 있는지 확인한다이 경우 65536

입니다 당신의 모든 가치가 긍정적이 될 것입니다.

2

글쎄, 당신은 단식으로 BitConverter을 찾은 것 같았습니다. 지금은 당신이 System.BitConverter 클래스를 사용하여 더 나은 봉사 것 같아요 ... 우리가 다른 사람뿐만 아니라 모든 것을 위해 그것을 사용하는 얻을 수 있는지

MemoryStream mem = new MemoryStream(_array); 


float ReadFloat(Stream str) 
{ 
    byte[] bytes = str.Read(out bytes, 0, 4); 
    return BitConverter.ToSingle(bytes, 0) 
} 

public int ReadInt32(Stream str) 
{ 
    byte[] bytes = str.Read(out bytes, 0, 4); 
    return BitConverter.ToInt32(bytes, 0) 
} 
+0

이 방법으로 전환 할 때 성능의 향상 또는 감소가 있습니까? Read (out byte [], offset, length) 메서드를 작성해야합니다. 제안 해 주셔서 감사합니다. –

1

을 할 수 있습니다.

특히 반바지의 경우 ToInt16 방법입니다.

질문에 언급하지 않았지만 하드웨어 장치가 데이터를 쓰는 엔디안이 무엇 인지도 알고 있어야합니다. 예를 들어 float가 리틀 엔디안 인 것처럼 보이지만 정수 빅 엔디안에있어? 필자는 하드웨어 장치가 바이너리 데이터의 출력에서 ​​엔디안을 섞을 것인지 의심 스럽습니다.

+0

기계가 작고 큰 엔디안을 믹싱합니다. –

+0

이상한! 이 경우에도 ToInt16 및 해당 메서드를 사용할 수 있으며 바이트를 스왑합니다. 이렇게하면 모든 바이트 스와핑을 하나의 함수 (또는 함수 계열)에 넣을 수 있습니다. 자세한 내용은 http://blogs.msdn.com/jeremykuhne/archive/2005/07/21/441247.aspx에서 자세히 설명합니다. – grieve

1

예 서명 된 단락의 경우 0xFFFF는 -1입니다.

또한 BinaryReader class을 사용하지 않으셨습니까?