Java의 16 진수 문자열에서 ISO-8859-1 문자열 생성, 비트 이동
-
06-07-2019 - |
문제
육각 분열을 ISO-8859-1, UTF-8 또는 UTF-16BE로 인코딩 된 문자열로 변환하려고합니다. 즉, 나는 다음과 같은 문자열이 있습니다. "0422043504410442"
이것은 문자를 나타냅니다. "Test"
UTF-16BE에서.
두 형식으로 변환하는 데 사용한 코드는 다음과 같습니다.
private static String hex2String(String hex, String encoding) throws UnsupportedEncodingException {
char[] hexArray = hex.toCharArray();
int length = hex.length() / 2;
byte[] rawData = new byte[length];
for(int i=0; i<length; i++){
int high = Character.digit(hexArray[i*2], 16);
int low = Character.digit(hexArray[i*2+1], 16);
int value = (high << 4) | low;
if( value > 127)
value -= 256;
rawData[i] = (byte) value;
}
return new String(rawData, encoding);
}
이것은 나에게 잘 작동하는 것 같지만 여전히 이것에 관한 두 가지 질문이 있습니다.
- 이 변환을 수행하는 더 간단한 방법 (바람직하게는 비트 처리없이)이 있습니까?
- 내가 어떻게 해석 해야하는지 :
int value = (high << 4) | low;
?
Java 구문에는 전혀는 아니지만 비트 처리의 기본 사항에 익숙합니다. 나는 첫 번째 부분이 모든 비트를 왼쪽으로 4 단계로 바꾸는 것을 믿는다. 나머지는 내가 이해하지 못하고 왜이 특정 상황에서 도움이 될지.
내 질문에 혼란에 대해 사과드립니다. 명확히 해야하는지 알려주세요. 고맙습니다. // abeansits
해결책
이 변환을 수행하는 더 간단한 방법 (바람직하게는 비트 처리없이)이 있습니까?
내가 알지 못하는 사람 - 유일한 단순화는 숫자에 의해 숫자를 구문 분석하는 대신 한 번에 전체 바이트를 구문 분석하는 것 같습니다 (예 : int value = Integer.parseInt(hex.substring(i * 2, i * 2 + 2), 16);
)
public static byte[] hexToBytes(final String hex) {
final byte[] bytes = new byte[hex.length() / 2];
for (int i = 0; i < bytes.length; i++) {
bytes[i] = (byte) Integer.parseInt(hex.substring(i * 2, i * 2 + 2), 16);
}
return bytes;
}
선을 해석하는 방법 : int value = (High << 4) | 낮은;?
마지막 두 자리 (42)에 대한이 예제를보십시오.
int high = 4; // binary 0100
int low = 2; // binary 0010
int value = (high << 4) | low;
int value = (0100 << 4) | 0010; // shift 4 to left
int value = 01000000 | 0010; // bitwise or
int value = 01000010;
int value = 66; // 01000010 == 0x42 == 66
다른 팁
당신은 그것을 교체 할 수 있습니다 <<
그리고 |
이 경우 *
그리고 +
, 그러나 나는 그것을 추천하지 않습니다.
표현식
int value = (high << 4) | low;
동일합니다
int value = high * 16 + low;
-128에서 127 사이의 값을 얻기 위해 256의 뺄셈은 불필요합니다. 예를 들어, 128에서 바이트를 주조하면 올바른 결과가 발생합니다. 가장 낮은 8 비트 int
128은 byte
-128 : 0x80.
나는 단순히 다음과 같이 쓸 것입니다.
rawData[i] = (byte) ((high << 4) | low);
이 변환을 수행하는 더 간단한 방법 (바람직하게는 비트 처리없이)이 있습니까?
당신은 사용할 수 있습니다 마녀 Apache Commons의 수업이지만 내부적으로는 약간의 차이가있는 것과 같은 일을 할 것입니다.
내가 어떻게 해석 해야하는지 :
int value = (high << 4) | low;
?
이것은 두 개의 16 진수 숫자를 결합하여 각각 4 비트를 나타내며, 서명되지 않은 8 비트 값으로 저장됩니다. int
. 다음 두 줄은 이것을 서명 된 자바로 변환합니다. byte
.