문제

육각 분열을 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);
}

이것은 나에게 잘 작동하는 것 같지만 여전히 이것에 관한 두 가지 질문이 있습니다.

  1. 이 변환을 수행하는 더 간단한 방법 (바람직하게는 비트 처리없이)이 있습니까?
  2. 내가 어떻게 해석 해야하는지 : 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.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top