2014-05-20 2 views
0

이 해결되었습니다. 내 파일이 손상된 부분을 확인했기 때문에 아래 답변을 수락했습니다. Maven 사유에 대해서는이 질문의 끝 부분을 읽으십시오.1 바이트 파일을 읽으면 0xEF가 반환됩니다. 0xBF 0xBD

바이트 0xA8을 포함하는 1 바이트 파일을 만들었습니다. 나는 그것을 나중에 사용할 수있는 자바 구조로 읽으려고한다. 자바의 바이트는 0x80에서 0xFF까지의 모든 값이 음수로 해석되므로 서명됩니다.

239, hex: ef 
read more: 191, hex: bf 
read more: 189, hex: bd 

0xA8.hex 파일이 1 :

import java.io.DataInputStream; 
import java.io.EOFException; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 

public class Test { 
    public static void main(final String[] args) throws IOException { 
     // 0xA8.hex contains one byte 0xA8. 
     final File inputFile = new File(Test.class.getClassLoader().getResource("0xA8.hex").getPath()); 
     final FileInputStream fin = new FileInputStream(inputFile); 
     final DataInputStream dis = new DataInputStream(fin); 
     int read = dis.readUnsignedByte(); 
     System.out.println(read + ", hex: " + Integer.toHexString(read)); 

     while (true) { 
      try { 
       read = dis.readUnsignedByte(); 
       System.out.println("read more: " + read + ", hex: " + Integer.toHexString(read)); 
      } catch (final EOFException ignored) { 
       break; 
      } 
     } 
    } 
} 

아마 정말 내가 부족하지만, 내가 주위에 내 머리를 정리 할 수없는 간단한 .. 출력 위의 프로그램은 무엇인가 있다 -byte 파일 16 진수 편집기를 사용하여 직접 만들었습니다. 그 내용은 실제로 하나의 싱글 바이트입니다 :

[email protected]:~/$ hexdump 0xA8.hex 
0000000 a8            
0000001 

왜, 어떻게하면 1 바이트 (가능하면 부호 없음으로 캐스트) 바이트를 읽을 수 있습니까?

솔루션

내가 메이븐을 사용하고 pom.xml에 나는 부분이 있었다 :

<build> 
    <resources> 
     <resource> 
      <directory>src/main/resources</directory> 
      <filtering>true</filtering> 
     </resource> 
    </resources> 
    <!-- ... --> 
</build> 

내가 사용 된 0xA8.hex 파일이 대체 문자를 입력, 메이븐에 의해 필터링있어 (은 0xEF에서 0xBF 0xBD를) 여기서 내 0xA8이었습니다. 지금까지 pom.xml에게 업데이트 된 다음

<build> 
    <resources> 
     <resource> 
      <directory>src/main/resources</directory> 
      <filtering>true</filtering> 
      <excludes> 
       <exclude>**/*.hex</exclude> 
      </excludes> 
     </resource> 
     <resource> 
      <directory>src/main/resources</directory> 
      <filtering>false</filtering> 
      <includes> 
       <include>**/*.hex</include> 
      </includes> 
     </resource> 
    </resources> 
    <!-- ... --> 
</build> 
+1

첫 번째 바이트는 파일의 BOM 헤더입니다 (http://en.wikipedia.org/wiki/Byte_order_mark). Hexeditor로 파일을 열면 그 파일이 보입니다. – Malte

+1

정말 바이너리 파일입니까? 바이트는 처음에 어떻게 쓰여 집니까? – fge

+1

'// 0xA8.hex에 1 바이트 0xA8이 들어 있습니다. '라는 말이 잘못되었습니다. 파일에 0xA8의 1 바이트 만 포함되어 있지 않습니다.이 사실을 증명해야합니다. – nos

답변

1

IT는 0xA8, 내가 다음 코드

File f = new File("0xA8.hex"); 
     FileOutputStream stream = new FileOutputStream(f); 
     stream.write(0xA8); 
     stream.flush(); 
     stream.close(); 
를 사용하여 간단한 파일을 생성하지 않았다 파일이 대체 문자를 http://www.utf8-chartable.de/unicode-utf8-table.pl?start=65280&utf8=dec

U+FFFD � 239 191 189 REPLACEMENT CHARACTER 

을 가진 것 같다

참고 ** 데모 용

그리고 당신의 프로그램을 사용하여 그것을 읽었을 때 예외로 작동합니다. 파일이 어떻게 손상되었는지 찾으십시오.

+0

Wauw, 네 말이 맞아! 제가 읽고있는 파일은 제가 읽고있는 파일이 아닙니다! 'Test.class.getClassLoader().내 코드에서 getResource ("0xA8.hex"). getPath()'는 필자가 텍스트 편집기를 사용하여 만든 파일이 아니라 Maven으로 필터링 된 테스트 자원을 가리킨다. 다시, wauw. – drvdijk