2012-03-06 2 views
0

좋아, 그래서 내가 수색하고 수색하고 아무것도 작동하지 ... 나는 int의 배열을 가지고, 각 int는 하위 바이트만을 차지합니다. 나는 표준 출력이 정확히 그 바이트를 포함 할자바 - int의 첫 번째 바이트를 쓰십시오

data[0] = Ox52 
data[1] = Oxe4 
data[2] = Ox18 
data[3] = Oxcb 

예를 들어, 내가 가진 (I 파일이 쓰기 나는 16 진수 편집기를 사용하여 파일을 검사하는 경우 또는 다른 말로, 내가 볼 수) :

52e418cb

어떻게하면됩니까?

그냥와 OR을 함께 파일/출력을 쓰기 전에 이동 당신의 도움이

+0

왜 '바이트'배열을 사용하지 않습니까? – moooeeeep

+0

나는 개인용으로 AES 구현을 적용하려고하고 있으며 int 배열을 사용하고 있습니다. 그리고 나는 여전히 그것을 작동시킬 수 없다, 나는 16 int (그러므로, 나는 16 바이트를 얻어야한다)의 배열을 가지고 있고 결국 24 바이트를 얻는다. < – Totor

+0

그래서 실제 질문은 바이너리 데이터를 stdout에 쓰는 방법인가? – moooeeeep

답변

0

가 잘 작동하는 것 같다. 나는 OutputStream.write(int) 방법을 사용하고 있습니다.

int[] ints = new int[] { 0x52, 0xe4, 0x18, 0xcb }; 
FileOutputStream os = new FileOutputStream(new File("/tmp/x")); 
for (int i : ints) { 
    os.write(i); 
} 
os.close(); 

결과

> hexdump /tmp/x 
0000000 52 e4 18 cb          
+0

그것이 작동합니다, 많이 고마워요! – Totor

0

주셔서 감사합니다 다음

(data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3] 
+0

이 솔루션은 64 비트 아키텍처에서도 작동합니까? – Sid

+1

일부 '& 0xff'마스킹을 추가해야합니다. 단지의 경우 ... – moooeeeep

+4

@Sid Java 'int'는 아키텍처가 무엇이든 관계없이 항상 32 비트입니다. 어쨌든이 개념은 쉽게 64 비트로 확장됩니다. – Taymon

1

이를위한 정확한 방법은 원하는 위치에 따른 바이트 시프트 한 후 OR 연산자를 사용하여 붙여서 것이다. 그러나 바이트를 이동하기 전에 바이트의 하위 8 비트에 비트 마스크를 수행해야합니다. 이것은 바이트가 처음으로 int로 변환되기 때문에 필요합니다 (이동이 완료되기 전에). 이것은 더 큰 문제가 없지만, 가장 높은 비트가 1 인 경우 (예 : 바이트는 음수), 귀하의 정수는 모든 주요 비트가 그래서 1

에 설정되도록하는,뿐만 아니라 부정적인 될 것입니다 :

(byte) 10000000 = (int) 11111111 11111111 11111111 10000000 

이 음의 int 값을 OR 연산자와 함께 사용하면 잘못된 결과가 발생합니다. 따라서 작동하는 라인은 다음과 같습니다.

((data[0] & 0xFF) << 24) | ((data[1] & 0xFF) << 16) | ((data[2] & 0xFF) << 8) | (data[3] & 0xFF) 
관련 문제