2012-03-17 2 views
1

저는 FPGA 프로젝트를위한 C# 직렬 인터페이스를 작성 중이며 현재 작업하고 있습니다. 문제가 발생했습니다. 나는 그러나 파일을 읽는 오류를 얻고 있지만 내가 디버그 동안한 번에 16 바이트 파일을 읽는 중

.. 16 바이트를 전송하고 올바른 수신시 다음 16 바이트 등을 보내, 한 번에 파일 16 바이트를 읽을 필요가 :

* 오프셋 및 길이가 배열의 범위를 벗어나거나 개수가 인덱스에서 소스 모음 끝까지의 요소 수보다 큽니다.

파일 크기가 약 1200 바이트이고 두 번째 파일에서 오류가 발생했습니다. 프로그램이 16 바이트 (즉, 파일의 16-31 바이트)를 읽으려고 할 때.

어떤 아이디어? 이 작업을 수행하는 데 잘못된 방법을 사용한 오프셋을 사용하고 있습니까? 당신이 대상 배열의 오프셋 (offset) 것으로 간주됩니다) 많은

감사합니다, 마이클

 ///////////////////// Get file data /////////////////// 
     else if (fileDataSent == false) 
     { 
      FileStream fs = File.OpenRead(tbFileToSend.Text); 
      try 
      { 
       byte[] readBytes = new byte[16]; 
       fs.Read(readBytes, nextReadOffset, 16); 
       fs.Close(); 
       for (int j = 0; j < 16; j++) 
       { 
        sendData[j + 3] = readBytes[j]; 
       } 
      } 
      finally 
      { 
       fs.Close(); 
      } 
      nextReadOffset = nextReadOffset + 16; 
      dataBytesSent = dataBytesSent + 16; 
      sendData[0] = Convert.ToByte("10000001", 2); 
      sendData[1] = ByteID; 
      sendData[2] = Convert.ToByte("11000011", 2); 
      sendData[19] = Convert.ToByte("11100111", 2); 
      ByteID++; 
      if (dataBytesSent == WriteFileSize) 
      { 
       fileDataSent = true; 
      } 
     } 

답변

0

Read 스트림의 현재 위치 (스트림을 열 때 0입니다)에서 읽습니다. 두 번째 매개 변수는 스트림이 아닌 수신 배열의 오프셋입니다.

읽을 때까지 현재 위치를 설정하려면 Seek을 사용하십시오.

는 AS 나는 다시 것 읽기와 복사 코드 : 당신이 뭔가 당신이 읽은 마지막 바이트의 위치보다 = 위치로 시작 지점으로 이동을 읽을 일단 의미 당신은 Stream에서 읽고

using (FileStream fs = File.OpenRead(tbFileToSend.Text)) 
{ 
    byte[] readBytes = new byte[16]; 
    fs.Seek(nextReadOffset, SeekOrigin.Begin); 
    fs.Read(readBytes, 0, 16); 

    readBytes.CopyTo(sendData, 3); 
} 
+0

고마워, 많은 감사. 즉, 스트림을 열 때마다 : (FileStream fs = File.OpenRead (tbFileToSend.Text);) 파일 포인터의 기본값은 0이됩니까? 또한 bytes가 <16 인 EOF 상황에서 읽을 수있는 데이터가없는 경우 readBytes []가 0으로 채워지겠습니까? 아니면 어떤 종류의 오류가 발생합니까? – TheEngineerer

+0

@ MichaelAlllen771 [문서] (http://msdn.microsoft.com/en-us/library/system.io.filestream.read.aspx)에 따르면'Read'는 실제로 읽혀진 바이트 수를 반환합니다. 대상 배열로), 더 많은 경우에 대비하여 요청 된 바이트 수보다 적을 수 있습니다. 주의 사항 절을 참조하십시오. – GSerg

0

(가) (fs.Read 오프셋을 주시면 감사하겠습니다 도움이 그래서는 높은 수준의 프로그래밍에 매우 경험입니다. 귀하의 경우에는 항상 0이어야합니다. 파일 포인터는 모든 Read() 호출과 함께 증가하므로 걱정할 필요가 없습니다. 그러나 읽기 위해 16 바이트가 남아 있지 않은 경우 (Read()의 반환 값)를 고려해야합니다.

+0

감사합니다. 많은 감사드립니다. 즉, 스트림을 열 때마다 : (FileStream fs = File.OpenRead (tbFileToSend.Text);) 파일 포인터의 기본값은 0이됩니까? 또한 bytes가 <16 인 EOF 상황에서 읽을 수있는 데이터가없는 경우 readBytes []가 0으로 채워지겠습니까? 아니면 어떤 종류의 오류가 발생합니까? – TheEngineerer

+0

감사합니다, 여러분 stackoverflow 생명의 은인 있습니다! – TheEngineerer

0

, + 1.

다음에 읽는 시간부터 읽어보십시오. 오프셋을 지정할 필요가 없습니다. 실제로 이렇게하면 바이트를 건너 뜁니다.

어떤 경우에는 존재하지 않는 파일의 위치에서 읽으려고합니다.

그래서 이것은 잘 할 것 :

var numberOfBytesActuallyRead = fs.Read(readBytes, 0, 16); 

numberOfBytesActuallyRead 실제로 Stream에 남아 얼마나 많은 바이트를 알려줍니다. 그런 다음 진행 방법을 결정할 수 있습니다. 인덱스가> (numberOfBytesActuallyRead -1) 인 값에 대한 readBytes 배열의 상태는 정의되어 있지 않습니다. 0이나 이전 값일 수 있습니다.

+0

감사합니다. 많은 감사합니다. 즉, 스트림을 열 때마다 : (FileStream fs = File.OpenRead (tbFileToSend.Text);) 파일 포인터의 기본값은 0이됩니까? 또한 bytes가 <16 인 EOF 상황에서 읽을 수있는 데이터가없는 경우 readBytes []가 0으로 채워지겠습니까? 아니면 어떤 종류의 오류가 발생합니까? – TheEngineerer

+0

@ MichaelAlllen771 반환 된 배열에 대해 실제로 읽는 바이트가 더 큰 인덱스 값이있는 상태에 대한 상태는 여전히 오래된 값 또는 0 또는 완전히 다른 것일 수 있습니다. – ntziolis

+0

감사합니다. 디버깅에 약간의 노력을 기울일 것입니다. 반환 된 배열의 내용을 확인합니다. 매우 감사. – TheEngineerer

관련 문제