본문 바로가기

Android/Function

[안드로이드 Java] Hex(16진수)와 Byte 형변환, 또는 Float으로 형변환

728x90
반응형

Byte→ Hex


String.format("%02x", b&0xff)

 

위의 코드를 이용하여 변환합니다. "%02x " 는 (b&0xff) 를 2자리 Hex String으로 출력합니다.

b&0xff 비트 연산은 앞에 비트가 의도치 않게 1로 채워졌을 때 0으로 바꿔주기 위함입니다.

byte는 8비트이나 앞의 한자리는 부호를 식별하기 때문에 범위는 -128~127이됩니다.

이 범위를 0~255로 바꾸어 주기 위해 &0xff를 사용하면 0xff는 00000000 00000000 00000000 11111111이므로,

127이 넘는 숫자가 나왔을 때도 앞의 비트를 0으로 바꿔주기 때문에, 양수 표현이 가능해 지게 됩니다.

예를들어 , 150이라는 int형 숫자를 표현하기 위해서는 150은 int형 32비트이기 때문에, 10010110이 확장되어 

11111111 11111111 11111111 10010110으로됩니다. 이는 150이 아닌 음수 -106 이기 때문에 &0xff를 통해

00000000 00000000 00000000 10010110인 150으로 바꾸어 주는 것입니다.

int형 byte를 사용하지 않는다면, 또는 이를 의도하지 않았다면, &0xff는 빼주면 됩니다.

public String byteArrayToHex(byte[] a) {
            StringBuilder sb = new StringBuilder();
            for(final byte b: a)
                sb.append(String.format("%02x", b/*&0xff*/));
            return sb.toString();
        }

 

Hex → Byte


예를들면 Hex String a55a문자열을 { 0xA5, 0x5A } 바이트 배열로 바꾸어 줍니다.

a하나, 5하나를 16진수로 받아 byte형으로 저장한뒤 a는 4비트 앞으로만 땡겨주면 { 0xA5, 0x5A } 바이트 배열로 바뀌게 됩니다.

public byte[] hexStringToByteArray(String s) {
    int len = s.length();
    byte[] data = new byte[len / 2];
    for (int i = 0; i < len; i += 2) {
        data[i / 2] = (byte) ( (Character.digit(s.charAt(i), 16) << 4)
               + Character.digit(s.charAt(i+1), 16) );
    }
      return data;
 }

 


Hex → Float


 

public float hexToFloat (String args) {

            Long i = Long.parseLong(args, 16);
            Float f = Float.intBitsToFloat(i.intValue());
            return f;
 }

intBitsToFloat()을 사용하였습니다.

 


 

Byte → Float

 


public float bytesToFloat (byte[] byteTemp) {
            ByteBuffer buf = ByteBuffer.wrap(byteTemp);
            return buf.getFloat();
}

getFloat()를 사용하였습니다.

 


 

728x90
반응형