2012-12-13 2 views
1

java.uti에서 새로운 내용은 16 진수 값을 갖는 텍스트 문서를 라인 단위로 읽으려고하고 바이트 배열로 변환하려고합니다. 하지만,도 8 (D), 11, 0, 같은 -28 대신 228 이 방법이 변환 오류를 극복 할 수 E4에 대한 잘못된 값을 얻는 IM 파싱 E4와 같은 16 진법 값 ....자바에서 16 진수를 바이트로 변환

  FileInputStream fstream = new FileInputStream("C:/Users/data.txt"); 

      DataInputStream in = new DataInputStream(fstream); 
      BufferedReader br = new BufferedReader(newInputStreamReader(in,"UTF-8")); 


      byte[] bytes = new byte[1024]; 
      String str; 
      int i=0; 

      while ((str = br.readLine()) != null) 
      { 

       bytes[i]= (byte) (Integer.parseInt(str,16) & 0xFF); 
       i++; 

      } 
      byte[] destination = new byte[i]; 
      System.arraycopy(bytes, 0, destination, 0, i); 

      br.close(); 
      return destination; 
+1

바이트의 Java가 서명됩니다. 그것의 범위는 -'[-128, 127]'이고,'127' 이후의 값은 음수쪽으로 가게됩니다. 따라서 '228'은 '-28'입니다. –

+0

DataInputStream을 사용하여 텍스트를 읽지 마십시오. http://vanillajava.blogspot.co.uk/2012/08/java-memes-which-refuse-to-die.html –

답변

1

Alnitak으로는 자바에 서명 . 0xe4의 값 = 228 서명하고, 나의 제안은 당신이 필요로이 같은 일을 얻을

int[] bytes = new int[1024]; 
bytes[i]= Integer.parseInt(str,16); 

처럼 int 대신 byte을 사용하는 것입니다 -128

127 byte의 범위는 어느 .

+0

그는 바이트 배열 (즉, 다른 API 호출에 대한 입력)을 원할만한 이유가있다. 부호없는 int로 변환 할 수있는 유일한 이유는 _presentation 목적 _에 대한 것이므로 내부 표현과 분리되어야합니다. – Alnitak

+1

또한'int'로 저장하는 것이'byte' 배열에 저장하는 것보다 네 배 더 많은 메모리를 필요로한다는 점에 유의하십시오 ... – Alnitak

+0

예 @Alnitak 맞습니다 ... –

5

바이트 (및 다른 모든 정수 유형)은 이고 이 아닌이 아니고 Java에서으로 서명되었습니다.

바이트를 바이트 배열로 취급하는 경우 일부 값이 음수이면 문제가되지 않으며 해당 비트 표현은 여전히 ​​올바른 것입니다.

결과 값이 itselt이 될 것입니다하지만 int 너무 당신의 int0xff와 바이트 값을 마스킹하여 "적절한"서명되지 않은 값을 얻을 수 있습니다

: byte 말했다

int n = (myByte & 0xff); 
+0

+1하지만 여전히 중요합니다. 그것들을 비트로 간주하고 그냥 디버깅하는 것이 아닙니다. 왜 왜 자바가 서명을 했는가 ... 나는 설명을 사지 않는다 : P – Esailija

관련 문제