숫자 값을 바이트 배열로 변환해야합니다. 예를 들어, 바이트 배열로 긴 변환, 나는이 방법을 가지고 :이 Java ByteBuffer의 동작에 대한 설명이 있습니까?
public static byte[] longToBytes(long l) {
ByteBuffer buff = ByteBuffer.allocate(8);
buff.order(ByteOrder.BIG_ENDIAN);
buff.putLong(l);
return buff.array();
}
그것은 매우 간단합니다 - 그것은을 저장할 수있는 배열을 할당이 오래 걸릴 거기에 그것을 던져. l
의 값이 무엇인지에 관계없이, 나는 8 바이트 배열을 가져와서 처리하고 의도 한대로 사용할 수 있습니다. 필자는 맞춤 바이너리 형식을 만든 다음 네트워크를 통해 전송합니다.
값이 773450364 인이 메서드를 호출하면 [0 0 0 0 46 25 -22 124]
배열이 반환됩니다. I 다시이 방법으로, 다른 방법에서 배열을 전달할 때
public static Long bytesToLong(byte[] aBytes, int start) {
byte[] b = new byte[8];
b[0] = aBytes[start + 0];
b[1] = aBytes[start + 1];
b[2] = aBytes[start + 2];
b[3] = aBytes[start + 3];
b[4] = aBytes[start + 4];
b[5] = aBytes[start + 5];
b[6] = aBytes[start + 6];
b[7] = aBytes[start + 7];
ByteBuffer buf = ByteBuffer.wrap(b);
return buf.getLong();
}
, 난 773,450,364 얻을 정확 : I는 다시 그들의 수치로 바이트 배열 변환 코드를 갖는다.
이제이 배열을 TCP를 통해 다른 Java 클라이언트에 전송합니다. java.io.InputStream.read()
메서드에 대한 설명서에 따르면 스트림 끝에 도달하고 -1이 반환되지 않는 한 int
값은 0에서 255 사이의 값을 반환합니다. 그러나 바이트 배열을 채우는 데 사용할 때받는 쪽에서 음수 값을 계속 가져옵니다. 이 오버플로 함께 할 수있는 용의자 (255 값을 Java 바이트에 맞지 않을 수 있으므로 바이트 배열에 넣을 때, 오버플로 및 음수가 될).
이것은 내 문제를 야기합니다. 음수의 존재는 나를 염려합니다. 지금은 바이트 수가 -128에서 127 사이 인 응용 프로그램의 Java 측을 개발 중입니다. 다른 끝점은 C, C++, Python, Java, C# ...이 될 수 있습니다. 일부 바이트 배열에서 음수 값의 존재가 처리에 어떻게 영향을 미치는지 확실하지 않습니다. 이 동작을 문서화하는 것 외에,이 시스템에서 작업하는 나 자신과 미래의 개발자, 특히 Java로 작성되지 않은 끝점에서 더 쉽게 만들 수 있습니까?
ByteBuffer의 endianness를'bytesToLong' 메소드에서'getToGong'과 같이'getLong()'을 호출하기 전에 설정하지 않아야합니까? 귀하의 질문에 정말로 관련이 없습니다. 궁금한 점이 있으시면 ... –
@G_H 나는 그것을 조사하고 테스트해야합니다. 실제로 이러한 방법 중 하나를 직접 작성하지 않았으며 테스트 사례가 부족합니다. 그 점을 지적 해 주셔서 감사합니다. –