자바에서 부호 없는 바이트를 만들 수 있나요?
부호 있는 바이트를 부호 없는 바이트로 변환하려고 합니다.문제는 수신한 데이터가 서명되지 않았고 Java는 서명되지 않은 바이트를 지원하지 않기 때문에 데이터를 읽을 때 서명된 바이트로 처리된다는 것입니다.
Stack Overflow에서 얻은 다음 솔루션으로 변환해 보았습니다.
public static int unsignedToBytes(byte a)
{
int b = a & 0xFF;
return b;
}
하지만 다시 바이트로 변환되면 동일한 서명된 데이터를 얻을 수 있습니다.이 데이터를 파라미터로 1바이트만 받아들이는 자바 함수의 파라미터로 사용하려고 하기 때문에 다른 데이터형은 사용할 수 없습니다.어떻게 하면 이 문제를 해결할 수 있을까요?
Java에서 원형이 서명된다는 사실은 메모리/트랜짓에서 표현되는 방법과 무관합니다. 바이트는 8비트일 뿐이며, 서명된 범위로 해석할지 여부는 사용자에게 달려 있습니다."이것이 서명됨" 또는 "이것이 서명되지 않음"을 나타내는 마법 플래그는 없습니다.
원형이 서명되면 Java 컴파일러는 +127보다 큰 값을 바이트에 할당할 수 없게 됩니다(또는 -128보다 작은 값).단, 이를 위해 int(또는 숏)를 다운캐스팅하는 것을 막을 수 있는 것은 없습니다.
int i = 200; // 0000 0000 0000 0000 0000 0000 1100 1000 (200)
byte b = (byte) 200; // 1100 1000 (-56 by Java specification, 200 by convention)
/*
* Will print a negative int -56 because upcasting byte to int does
* so called "sign extension" which yields those bits:
* 1111 1111 1111 1111 1111 1111 1100 1000 (-56)
*
* But you could still choose to interpret this as +200.
*/
System.out.println(b); // "-56"
/*
* Will print a positive int 200 because bitwise AND with 0xFF will
* zero all the 24 most significant bits that:
* a) were added during upcasting to int which took place silently
* just before evaluating the bitwise AND operator.
* So the `b & 0xFF` is equivalent with `((int) b) & 0xFF`.
* b) were set to 1s because of "sign extension" during the upcasting
*
* 1111 1111 1111 1111 1111 1111 1100 1000 (the int)
* &
* 0000 0000 0000 0000 0000 0000 1111 1111 (the 0xFF)
* =======================================
* 0000 0000 0000 0000 0000 0000 1100 1000 (200)
*/
System.out.println(b & 0xFF); // "200"
/*
* You would typically do this *within* the method that expected an
* unsigned byte and the advantage is you apply `0xFF` only once
* and than you use the `unsignedByte` variable in all your bitwise
* operations.
*
* You could use any integer type longer than `byte` for the `unsignedByte` variable,
* i.e. `short`, `int`, `long` and even `char`, but during bitwise operations
* it would get casted to `int` anyway.
*/
void printUnsignedByte(byte b) {
int unsignedByte = b & 0xFF;
System.out.println(unsignedByte); // "200"
}
제가 당신의 질문을 이해했는지 모르겠어요.
에 대해 가 없는 바이트 하지만 -12(서명값)로 되었습니다).int
public static int unsignedToBytes(byte b) {
return b & 0xFF;
}
public static void main(String[] args) {
System.out.println(unsignedToBytes((byte) -12));
}
그게 네가 원하는 거니?
에서는 를 Java 244 네트워크로서 할 수 .byte
다아미타의 Byte.MAX_VALUE
.short
,int
★★★★★★★★★★★★★★★★★」long
.
Java에서 부호 없는 바이트를 사용하기 위한 전체 가이드:
Java 부호 없는 바이트
(이 답변의 소스).
는 Java Language와 .unsigned
키워드를 지정합니다. a.byte
언어 사양에 따르면 -128 - 127 사이의 값을 나타냅니다.를 들어, " " " 의 ,byte
int
Java는 첫 번째 비트를 기호로 해석하고 기호 확장자를 사용합니다.
'', '다', '다', '다', '다', '다', '다', '다', '다', '다', '다', '다', '다', '다', '다', '다', '다', '다', '다', '다', '다',byte
단순히 8비트로 해석하여 0에서 255 사이의 값으로 해석합니다.당신의 해석을 다른 사람의 방법에 강요할 수 있는 것은 아무것도 없다는 것을 명심하세요.가 음음음음 a a를 경우byte
이 메서드는 특별히 명시되어 있지 않는 한 -128 ~127 사이의 값을 받습니다.
다음은 사용자의 편의를 위해 유용한 몇 가지 변환/조작입니다.
int로의 변환 또는 int로부터의 변환
// From int to unsigned byte
int i = 200; // some value between 0 and 255
byte b = (byte) i; // 8 bits representing that value
// From unsigned byte to int
byte b = 123; // 8 bits representing a value between 0 and 255
int i = b & 0xFF; // an int representing the same value
(Java 8+ 를 사용하고 있는 경우는, 을 사용해 주세요).
해석/서식
가장 좋은 방법은 위의 변환을 사용하는 것입니다.
// Parse an unsigned byte
byte b = (byte) Integer.parseInt("200");
// Print an unsigned byte
System.out.println("Value of my unsigned byte: " + (b & 0xFF));
산술
2-완성 표현은 덧셈, 뺄셈 및 곱셈에 대해 "그냥" 작동합니다.
// two unsigned bytes
byte b1 = (byte) 200;
byte b2 = (byte) 15;
byte sum = (byte) (b1 + b2); // 215
byte diff = (byte) (b1 - b2); // 185
byte prod = (byte) (b2 * b2); // 225
분할에는 오퍼랜드의 수동 변환이 필요합니다.
byte ratio = (byte) ((b1 & 0xFF) / (b2 & 0xFF));
Java에는 원시 부호 없는 바이트가 없습니다.보통 큰 글씨로 던지는 것이 일반적입니다.
int anUnsignedByte = (int) aSignedByte & 0xff;
다른 답변은 메모리 표현에 대해 다루고 있으며, 이를 어떻게 다루느냐는 사용방법에 따라 달라집니다.Java 8이 서명되지 않은 유형을 처리하기 위한 지원을 추가했습니다.이 경우, 다음을 사용할 수 있습니다.
int unsignedInt = Byte.toUnsignedInt(myByte);
사이드 노트, 인쇄하고 싶으면 이렇게 말하면 돼요.
byte b = 255;
System.out.println((b < 0 ? 256 + b : b));
다음 항목도 있습니다.
public static int unsignedToBytes(byte a)
{
return (int) ( ( a << 24) >>> 24);
}
설명:
'아예'라고 하자.a = (byte) 133;
메모리에는 "1000 0101"(16진수에서는 0x85)로 저장됩니다.
따라서 unsigned=signed, signed=-123(2's complete)을 변환합니다.
a < < 24
왼쪽으로 24비트를 이동하면 결과는 다음과 같은 4바이트 정수가 됩니다.
"101101 000000000000000000" (또는 16진수로는 "0x85000000")
그럼 우리는
( a < < 24 >> 24 >
다시 오른쪽 24비트로 이동하지만 선행 0으로 채워집니다.그 결과 다음과 같습니다.
"00000000000000000000101" (또는 16진수로는 "0x00000085")
133에 해당하는 부호 없는 표현입니다.
a = (int) a;
그러면 2의 보완 표현 바이트를 유지하고 2의 보완 표현으로서 int로 저장합니다.
(int) "param101" ---> "11111111111111111110000101"
즉, -123입니다.
자바가 부호 없는 바이트를 언어에 포함하지 않은 것이 귀찮아 보일 수 있지만 (C에서 온) 간단한 "b & 0xFF" 연산은 실제로 필요한 (signed) 바이트 b의 부호 없는 값을 산출하기 때문에 큰 문제가 되지 않습니다.비트는 실제로 변경되지 않고 해석만 가능합니다(예를 들어 값에 대한 산술 연산을 수행할 때만 중요함).
만약 당신이 이런 것을 찾고 있다고 생각한다면.
public static char toUnsigned(byte b) {
return (char) (b >= 0 ? b : 256 + b);
}
아담스키는 가장 좋은 답을 제시했지만, 아직 완전하지는 않았어요. 그러니 그의 답변을 읽어보세요. 제가 그렇지 않다는 것을 자세히 설명해 주니까요.
부호 없는 바이트를 전달해야 하는 시스템 기능이 있는 경우 부호 있는 바이트를 자동으로 부호 없는 바이트로 처리하므로 부호 있는 바이트를 전달할 수 있습니다.
따라서 시스템 함수에 4바이트가 필요한 경우, 예를 들어 192 168 0 1을 부호 없는 바이트로 전달하면 -64 -88 0 1을 전달할 수 있으며, 함수에 전달하면 서명 해제되기 때문에 함수는 계속 작동합니다.
그러나 시스템 함수는 크로스 플랫폼 호환성을 위해 클래스 뒤에 숨겨져 있기 때문에 이 문제는 발생하지 않습니다.단, java.io 읽기 메서드 중에는 가중치 없는 바이트가 int로 반환되는 것도 있습니다.
이 기능을 보려면 파일에 서명된 바이트를 쓴 후 서명되지 않은 바이트로 다시 읽어 보십시오.
이 데이터를 1바이트만 파라미터로 받아들이는 자바 함수의 파라미터로 사용하려고 합니다.
이는 함수가 2^32-1보다 큰 값을 전달하려는 정수를 받아들이는 것과 실질적으로 다르지 않습니다.
이는 함수의 정의와 문서화 방법에 따라 달라지는 것처럼 들립니다.다음 세 가지 가능성을 볼 수 있습니다.
함수가 바이트를 부호 없는 값으로 취급하는 것을 명시적으로 문서화할 수 있습니다.이 경우 함수는 사용자가 예상한 대로 실행해야 하지만 잘못 구현된 것처럼 보일 수 있습니다.정수 케이스의 경우 함수는 파라미터를 부호 없는 정수로 선언할 수 있지만 바이트 케이스에서는 불가능합니다.
이 인수의 값은 0보다 커야 합니다(또는 같은 경우도 있습니다).이 경우 함수를 잘못 사용하고 있습니다(범위를 벗어난 파라미터를 전달하고 있습니다).이 경우 이 인수가 의도한 것보다 더 많은 처리를 할 것으로 기대됩니다.일정 수준의 디버깅지원에서는 함수가 예외를 발생시키거나 어설션에 실패할 수 있습니다.
문서에는 아무것도 기재되어 있지 않습니다.이 경우 음의 파라미터는 음의 파라미터이며, 그 의미가 있는지 여부는 함수의 기능에 따라 달라집니다.이것이 의미가 없는 경우, 그 함수는 (2)로 정의/문서화할 필요가 있습니다.이것이 명백하지 않은 방식으로 의미가 있는 경우(예를 들어 음이 아닌 값은 배열의 끝에서 다시 인덱스를 작성하기 위해 사용되며 -1은 마지막 요소를 의미함) 문서에는 의미에 대한 설명이 있어야 합니다.어쨌든 이것은 사용자가 원하는 것이 아닙니다.
netty ByteBuf write의 명백한 비대칭성에 대해 궁금해서 우연히 이 페이지를 열게 되었습니다.Int 및 readUnsignedInt 메서드
흥미롭고 교육적인 답변을 읽은 후에도 다음과 같은 말을 했을 때 어떤 함수를 호출했는지 궁금했습니다.
저는 이 데이터를 1바이트만 파라미터로 받아들이는 자바 함수의 파라미터로 사용하려고 합니다.
오랜 세월이 흘렀지만, 여기 내 50센트가 있다.
호출하고 있는 메서드가 마이크로 금액으로 잔액을 업데이트하고 있고 잘 정의된 요구 사항에 따라 동작한다고 가정해 보겠습니다.즉, 의도된 동작에 대해 올바르게 구현된 것으로 간주됩니다.
long processMicroPayment(byte amount) {
this.balance += amount;
return balance;
}
기본적으로 플러스 금액을 입력하면 잔액에 가산되고 마이너스 금액은 잔액에서 사실상 차감됩니다.이제 바이트를 매개 변수로 받아들이기 때문에 함축적 가정은 기능적으로 -128 ~ +127 사이의 양만 받아들인다는 것입니다.따라서 이 방법을 사용하여 잔액에 130을 더하는 경우, 이 방법을 구현하면 127보다 높은 금액을 나타낼 수 없기 때문에 원하는 결과를 얻을 수 없습니다.그래서 130을 넘긴다고 해서 원하는 행동이 되는 것은 아닙니다.130은 여전히 방법의 계약을 준수하는 음의 값으로 '해석'되기 때문에 이 방법은 (예를 들어) SumeOutOfBoundsException을 구현할 방법이 없다는 점에 유의하십시오.
그래서 다음과 같은 질문이 있습니다.
- (명시적 또는 명시적) 계약에 따라 방법을 사용하고 있습니까?
- 방법이 올바르게 구현되어 있는가?
- 내가 아직도 당신의 질문을 오해하고 있나요?
Java에는 부호 없는 바이트가 없지만 바이트를 표시하려면 다음 작업을 수행할 수 있습니다.
int myInt = 144;
byte myByte = (byte) myInt;
char myChar = (char) (myByte & 0xFF);
System.out.println("myChar :" + Integer.toHexString(myChar));
출력:
myChar : 90
자세한 내용은 Java에서 16진수/바이트 값을 표시하는 방법을 확인하십시오.
한마디로 이야기할 수 없군요.나는 이 문제에 대해 자세히 조사해 왔다.내가 이걸 이해하는 것처럼:
사실 java는 -128~127에 인터거를 서명했습니다.다음과 같이 Java에서 부호 없는 를 표시할 수 있습니다.
public static int toUnsignedInt(byte x) {
return ((int) x) & 0xff;
}
예를 들어 -12의 서명된 번호를 서명 없이 더하면 244가 됩니다.하지만 당신은 그 번호를 다시 수화로 사용할 수 있습니다. 다시 수화로 전환해야 합니다. 그러면 다시 -12가 됩니다.
Java 바이트에 244를 추가하려고 하면 outOfIndexException이 나옵니다.
건배..
부호 있는 바이트를 전달해야 하는 함수가 있는 경우 부호 없는 바이트를 전달하면 어떤 기능이 수행될 것으로 예상하십니까?
다른 데이터 유형을 사용할 수 없는 이유는 무엇입니까?
변환이 단순하거나 없는 부호 없는 바이트로 바이트를 사용할 수 있습니다.그것은 모두 어떻게 쓰느냐에 달려있다.당신은 그것을 가지고 무엇을 할 것인지 명확히 할 필요가 있다.
Java의 제한에 따라 현재 데이터 형식에서는 부호 없는 바이트가 거의 불가능합니다.구현 중인 다른 언어의 라이브러리를 선택한 후 JNI를 사용하여 호출할 수 있습니다.
Java에서 서명되지 않은 바이트를 원하는 경우 원하는 숫자에서 256을 빼면 됩니다.부호 없는 바이트 단위의 원하는 숫자인 음의 값을 사용하여 2의 보수가 생성됩니다.
예:
int speed = 255; //Integer with the desired byte value
byte speed_unsigned = (byte)(speed-256);
//This will be represented in two's complement so its binary value will be 1111 1111
//which is the unsigned byte we desire.
NXT 브릭을 프로그래밍하기 위해 LeJOS를 사용할 때는 이러한 지저분한 해킹을 사용해야 합니다.
언급URL : https://stackoverflow.com/questions/4266756/can-we-make-unsigned-byte-in-java
'programing' 카테고리의 다른 글
C에서 매크로를 사용하는 이유 (0) | 2022.08.21 |
---|---|
vue.js에서 어레이 개체 속성에 액세스하는 중 (0) | 2022.08.21 |
Vuejs Ajax 콜 및 데이터 테이블 (0) | 2022.08.21 |
bool의 printf 형식 지정자는 무엇입니까? (0) | 2022.08.21 |
스캐너와버퍼리더 (0) | 2022.08.21 |