2010-02-06 2 views
16

자바로 프로세스를 이식하고 있습니다. 이미 C# 및 C++에서 작동하는 버전이 있습니다.Java에서 long [64]를 byte [512]로 변환 하시겠습니까?

Marshal.Copy (...)를 사용하여 64 개의 ulong을 512 바이트로 변환하고 C++의 해당 줄을 memmove (...)를 사용하여 동일한 작업을 수행하는 섹션이 있습니다. 같은 결과를 얻기 위해 Java에서 사용할 수있는 것은 무엇입니까? long 같은 대신에 바이트와 같은 순서로 동일한 이진 정보가 필요합니다.

편집 :

내가 자바로 포팅하고 있습니다 이유는 자바가 자연적으로 가지고있는 이동성을 활용하는 것입니다. 네이티브 코드를 사용하고 싶지 않습니다.

또 하나. Java에는 부호없는 값이 포함되어 있지 않기 때문에 요청하는 내용을 약간 변경해야합니다. 나는 배열의 인덱스에서 그 값을 사용할 수 있도록 각각 64 개의 long (C# 및 C++의 ulongs)에서 8 개의 부호없는 바이트 값을 얻고 싶습니다. 이것은 수천 번 발생할 수 있으므로 가장 빠른 방법이 최선의 방법입니다.

답변

20

ByteBuffer은 다음과 같이 잘 작동합니다. array() 방법을 사용하여 값이이되고 byte[]이됩니다. ByteOrder 클래스는 엔디안 문제를 효과적으로 처리 할 수 ​​있습니다. 예를 들어, 접근 방식을 통합하는 것은 wierob에 의해 코멘트에서 제안 :

private static byte[] xform(long[] la, ByteOrder order) { 
    ByteBuffer bb = ByteBuffer.allocate(la.length * 8); 
    bb.order(order); 
    bb.asLongBuffer().put(la); 
    return bb.array(); 
} 

부록 : 결과 byte[] 구성 요소가 서명, 8 비트 값하지만, 자바 배열은 nonnegative integer index values이 필요합니다.

int i = (int) b & 0xFF; 

answer가 해당 연산자 우선 순위 규칙에 정성 들여 : 부호 확장을 초래할 수있는 intbyte 캐스팅,하지만 높은 순서 비트를 마스킹 byte b의 부호 값을 제공 할 것입니다. 이 관련 answerdouble 값에 대해 유사한 접근법을 보여줍니다.

+1

+1 루프가 필요하지 않습니다. bb.asLongBuffer(). put (la); – wierob

+1

고마워요! 제안은 읽기 쉽고 잠재적으로 더 효율적입니다. http://java.sun.com/javase/6/docs/api/java/nio/ByteBuffer.html#views – trashgod