byte 16진수 문자열 반환

SOO·2021년 3월 3일
0

byte를 HexString으로 변환하는 방법

  • code
1
Integer.toString((byteData & 0xff+ 0x10016).substring(1)
cs

Q1. &0xff 비트연산을 하는 이유?

A. 의도치 않게 채워진 1을 전부 0으로 바꾸기 위해 수행한다.

  1. byte형은 8비트의 공간을 차지하고, int는 32비트의 공간을 차지한다.
  2. 비트연산자 &를 수행하는 경우, 비트수가 넓은 곳에 맞춰 낮은 비트를 가진 자료형을 확장한다.
  3. byteData & 0xff를 수행하는 경우, byte는 32비트의 int형으로 강제 형변환이 된다. 이 때 비트의 확장 시, byteData의 가장 앞의 비트가 0인 경우는 0으로, 1인 경우는 1로 모든 비트를 채워 확장한다.
  4. 이 경우 원본 값과 전혀 다른 값이 되기 때문에 &0xFF와 비트 연산을 수행한다.
  • &0xFF는 10진수 255, 2진수 11111111을 16진수로 나타낸 것이다. 8비트의 byte와 32비트(4바이트)의 int를 비트연산할 경우 다음과 같이 의도치 않게 확장되며 채워진 1을 0으로 변경한다.

    11111111111111111111111110010110
    00000000000000000000000011111111
    -------------------------------------------
    00000000000000000000000010010110

Q2. 0x100을 더해주는 이유?

A. 메소드의 결과값을 강제로 3자리로 만든다.

  • 연산 유무와 관계없이 결과값은 동일하다. 하지만 0x100을 더해주면 Integer.toString(n, 16) 메소드의 결과값을 강제로 3자리로 만들어준다.
1
2
3
4
5
6
7
8
int i = 1;
System.out.println( Integer.toString((byte)i & 0xff16) ); // 16 진수 "1"이 출력
        
int j = 200;
System.out.println( Integer.toString((byte)j & 0xff16) ); // 16 진수 "c8"이 출력
 
 
출처: https://javaslave.tistory.com/59 [전산쟁이 블로그]
cs
  • 0x100을 더하지 않는 경우의 결과

  • 0x100을 더하는 경우의 결과

Q3. .substring(1)

1
2
3
4
5
6
7
8
int i = 1;
System.out.println( Integer.toString(((byte)i & 0xff)+0x10016).substring(1) ); // 16 진수 "01"
        
int j = 200;
System.out.println( Integer.toString(((byte)j & 0xff)+0x10016).substring(1) ); // 16 진수 "c8"
 
 
출처: https://javaslave.tistory.com/59 [전산쟁이 블로그]
cs
  • 처리 결과에 substring(1)을 해주면 2자리에 맞게 16진수가 변경되어 출력된다.

출처:

0개의 댓글