2016-08-20 3 views
0

예고편으로 볼 때, 이것은 처음에는 적절한 C# 프로그램이고, 프로그래밍 경험은 주로 TES5Edit에 대한 파스칼 스크립트 작성과 관련이 있습니다. 나사로에서 두 개의 실제 프로그램을 만들었지 만, 틀린, 그들은 꽤 끔찍합니다.C# - 알려진 오프셋으로 파일에서 바이트 가져 오기

은 '나에게 현재 코드를 업로드 감수해야 : 어쨌든 http://www.mediafire.com/download/fadr8bc8d6fv7cf/WindowsFormsApplication1.7z

! 현재 내가하려고하는 것은 .dds 파일의 두 개의 특정 오프셋에서 바이트 값을 가져 오는 것입니다. x 해상도는 @ offset + 0c로 유지되며 2 바이트로 구성됩니다 (그래서 + 0c와 + 0d). y 해상도에 대한 동일 공연; @ offset +10 & +11. 여기에 결과를 업로드했습니다 : http://pastebin.com/isBKwaas

그러나 어떻게해야할지 모르겠습니다. 내가 여러 Google 검색 결과에서 해독 한 결과는 다음과 같이 나타났습니다.

 public void GetDDSDimensions(string strDDSFilename, out int iSourceDDSx, out int iSourceDDSy) 
    { 
     FileStream fsSourceDDS = new FileStream(strDDSFilename, FileMode.Open, FileAccess.Read); 
     int iWidthOffset = 12; // 0c in hex, if byte is 00, then size is => 256, so get +0d as well 
     int iHeightOffset = 16; // 10 in hex, same gig as above. Get byte @ +11 if +10 is 00. 
     byte[] bufferDDSBytes = new byte[24]; // @ Offset +24 , byte is always 01. Use as a wee, err, "landmark". 

    } 

단서가 없습니다. fsSourceDDS의 처음 24 바이트를 nab에 저장하고, .dds 파일의 해상도를 얻기 위해 16 진수 값을 + + 0c와 +10과 비교하는 방법으로 bufferDDSBytes를 설정해야합니다.

비교하기 쉽습니다. C#은 Pascal의 StrToInt() 함수에 해당하는 16 진수 여야합니다.

+0

을 그래서 기본적으로 당신이 오프셋 특정 파일에서 인코딩 된'ushort' 리틀 엔디안을 읽는 방법을 요구하고있다. –

+0

맞습니다. LE와 BE는 바이트 순서와 관련이 있습니다. LE에서 16 진수 4000은 '00 40 '으로 쓰여졌지만 BE에서는 '40 00'으로 쓰여졌습니다. 그리고 ushort는 작은 정수형 변수 인 것 같습니다. – MajinCry

+0

수정하십시오. 실제로 데이터를 살펴보면 0xc, 0xc + 4 –

답변

3

첫째, 스트림에서 특정 오프셋로 이동하려면

using (FileStream fsSourceDDS = new FileStream(strDDSFilename, FileMode.Open, FileAccess.Read)) 
{ 
    // do something with the FileStream 
} // Ensures that it is properly closed/disposed 

:-) using를 사용 Seek 방법을 사용

fsSourceDDS.Seek(someOffset, SeekOrigin.Begin); 

을 얻을하는 ReadByte 나에 Read 메소드를 호출 원하는만큼의 바이트 수. 바이트를 읽어 들이고 나면 스트림의 위치가 읽은 바이트 수만큼 전진합니다. Position 속성을 사용하여 스트림에서 현재 위치를 가져올 수 있습니다. 스트림에서 직접 리틀 엔디안 값을 읽으려면 BinaryReader 클래스를 사용할 수 있습니다.

은 위의 모든 결합하려면

using (FileStream fsSourceDDS = new FileStream(strDDSFilename, FileMode.Open, FileAccess.Read)) 
using (BinaryReader binaryReader = new BinaryReader(fsSourceDDS)) 
{ 
    fsSourceDDS.Seek(0x0c, SeekOrigin.Begin); 
    ushort with = binaryReader.ReadUInt16(); 
    fsSourceDDS.Seek(0x10, SeekOrigin.Begin); 
    ushort height = binaryReader.ReadUInt16(); 
} 
+1

오프셋에서 LE'int' (4 바이트) 일 가능성이 높습니다. BitConverter는 리틀 엔디안을 사용할 수 있다고 보장하지 않습니다. 사용되는 올바른 클래스는'BinaryReader'입니다. –

+0

네 말이 맞아. 고마워. 나는 대답을 업데이트했다. – ArgusMagnus

+0

천천히 설명서를 살펴 봅니다. 신속하게 게시하지 않는 것을 용서하고, 달팽이 속도로 작성합니다. 'Seek()'함수를 사용할 때 반환 된 값을 다음 함수로 전달합니다. 어셈블리의 'cmp'및 'je'함수와 비슷합니다. 전자가 호출 될 때, 결과는 다음 코드 줄로 옮겨집니다.이 줄은 일반적으로 je (또는 파생물)이며, cmp가 true 또는 false를 반환했는지에 따라 전달되지 않습니다. – MajinCry

관련 문제