Java에서 바이트 배열을 정수로 변환하거나 그 반대로 변환합니다.
자바에서 바이트 배열에 데이터를 저장하고 싶습니다.기본적으로 숫자당 최대 2바이트를 차지할 수 있는 숫자입니다.
정수를 2바이트 길이의 바이트 배열로 변환하는 방법과 그 반대로 변환하는 방법을 알고 싶습니다.많은 솔루션이 검색되고 있는 것을 알 수 있었습니다만, 코드에서 무슨 일이 일어나는지 설명하지 않는 것이 대부분입니다.제가 잘 모르는 것이 많기 때문에 기본적인 설명을 해 주시면 감사하겠습니다.
특히 네임스페이스에 있는 클래스를 사용합니다.모든 일을 다 할 수 있어요.
byte[] arr = { 0x00, 0x01 };
ByteBuffer wrapped = ByteBuffer.wrap(arr); // big-endian by default
short num = wrapped.getShort(); // 1
ByteBuffer dbuf = ByteBuffer.allocate(2);
dbuf.putShort(num);
byte[] bytes = dbuf.array(); // { 0, 1 }
byte[] toByteArray(int value) {
return ByteBuffer.allocate(4).putInt(value).array();
}
byte[] toByteArray(int value) {
return new byte[] {
(byte)(value >> 24),
(byte)(value >> 16),
(byte)(value >> 8),
(byte)value };
}
int fromByteArray(byte[] bytes) {
return ByteBuffer.wrap(bytes).getInt();
}
// packing an array of 4 bytes to an int, big endian, minimal parentheses
// operator precedence: <<, &, |
// when operators of equal precedence (here bitwise OR) appear in the same expression, they are evaluated from left to right
int fromByteArray(byte[] bytes) {
return bytes[0] << 24 | (bytes[1] & 0xFF) << 16 | (bytes[2] & 0xFF) << 8 | (bytes[3] & 0xFF);
}
// packing an array of 4 bytes to an int, big endian, clean code
int fromByteArray(byte[] bytes) {
return ((bytes[0] & 0xFF) << 24) |
((bytes[1] & 0xFF) << 16) |
((bytes[2] & 0xFF) << 8 ) |
((bytes[3] & 0xFF) << 0 );
}
서명된 바이트를 int로 패킹할 때 각 바이트는 산술 프로모션 규칙(JLS, 변환 및 프로모션에 설명되어 있음)에 따라 32비트로 확장되어 있기 때문에 마스크오프해야 합니다.
이와 관련된 흥미로운 퍼즐이 조슈아 블로흐와 닐 가프의 Java Puzzlers("A Big Delight in Every Byte")에 설명되어 있다.바이트 값을 int 값과 비교할 때 바이트는 int로 부호 확장되고 이 값은 다른 int와 비교됩니다.
byte[] bytes = (…)
if (bytes[0] == 0xFF) {
// dead code, bytes[0] is in the range [-128,127] and thus never equal to 255
}
16비트 부호 없는 정수형 char를 제외하고 모든 숫자 유형은 Java로 서명됩니다.
가변 길이 바이트에 BigInteger를 사용할 수도 있습니다.필요에 따라 long, int, short로 변환할 수 있습니다.
new BigInteger(bytes).intValue();
또는 극성을 나타냅니다.
new BigInteger(1, bytes).intValue();
바이트를 되돌리려면:
new BigInteger(bytes).toByteArray()
기본적인 실장은 다음과 같습니다.
public class Test {
public static void main(String[] args) {
int[] input = new int[] { 0x1234, 0x5678, 0x9abc };
byte[] output = new byte[input.length * 2];
for (int i = 0, j = 0; i < input.length; i++, j+=2) {
output[j] = (byte)(input[i] & 0xff);
output[j+1] = (byte)((input[i] >> 8) & 0xff);
}
for (int i = 0; i < output.length; i++)
System.out.format("%02x\n",output[i]);
}
}
내용을 이해하려면 WP 기사 http://en.wikipedia.org/wiki/Endianness를 참조하십시오.
위의 소스 코드가 출력됩니다.34 12 78 56 bc 9a
. 처음 2바이트 (34 12
)는 첫 번째 정수 등을 나타냅니다.위의 소스 코드는 정수를 리틀 엔디언 형식으로 인코딩합니다.
/** length should be less than 4 (for int) **/
public long byteToInt(byte[] bytes, int length) {
int val = 0;
if(length>4) throw new RuntimeException("Too big to fit in int");
for (int i = 0; i < length; i++) {
val=val<<8;
val=val|(bytes[i] & 0xFF);
}
return val;
}
구아바는 필요한 것을 가지고 있는 경우가 많습니다.
바이트 배열에서 int로 이동하려면:Ints.fromBytesArray
, doc.여기에
int 배열에서 바이트 배열로 이동하려면:Ints.toByteArray
, doc.여기에
비트에서 읽어야 하는 요건을 가진 사용자는 3비트에서만 읽어야 하지만 부호 있는 정수가 필요하다고 가정하고 다음을 사용합니다.
data is of type: java.util.BitSet
new BigInteger(data.toByteArray).intValue() << 32 - 3 >> 32 - 3
매직 넘버3
는 사용 중인 비트 수(바이트가 아님)로 대체할 수 있습니다.
이게 int에 캐스팅하기에 가장 좋은 모드라고 생각합니다.
public int ByteToint(Byte B){
String comb;
int out=0;
comb=B+"";
salida= Integer.parseInt(comb);
out=out+128;
return out;
}
첫 번째 바이트를 문자열로 변환
comb=B+"";
다음 단계는 int로 변환됩니다.
out= Integer.parseInt(comb);
byte는 -128~127의 분노입니다.rage 0~255를 사용하는 것이 좋다고 생각합니다.이것만 하면 됩니다.
out=out+256;
언급URL : https://stackoverflow.com/questions/7619058/convert-a-byte-array-to-integer-in-java-and-vice-versa
'programing' 카테고리의 다른 글
Vuetify Vuex에서 API의 외부 데이터와 함께 데이터 테이블을 사용합니다. (0) | 2022.08.19 |
---|---|
vue.js 템플릿 내의 php 어레이에 액세스합니다. (0) | 2022.08.18 |
malloc/free/new/delete에서 컴파일러가 메모리를 0xCD, 0xDD 등으로 초기화하는 시기와 이유는 무엇입니까? (0) | 2022.08.18 |
[Vue warn] :속성 또는 메서드가 인스턴스에서 정의되지 않았지만 렌더링 중에 참조됩니다. (0) | 2022.08.18 |
인수가 있는 Vuex 매핑 Getter - 캐시됨? (0) | 2022.08.18 |