자바사춘기
117
2018-02-12 17:55:37
2
764

16진수. 숫자/문자타입 각각 변환이 원래 다른가요?


기존에는 라이브러리 사용해서 신경도 안쓰고 함수호출해서 쓰느라 함수 내부를 제대로 본적이 없었는데요. 이번에 사정상 맨땅 날코딩으로 네트워크 프로그래밍을 해야할 상황이 왔습니다.


예를 들어 제가 값 120300 을 16진수로 변환후, 바이트배열로 tcp 통신을 해야하는데요.


일단 120300을 16진수로 변환하려는데.


1. Long.toHexString(120300) 를 사용하면, 결과값이.

   0001D5EC  이렇게 나오구요.


2. 함수를 사용하여. 문자열로서 "120300" 을 변환하면 결과값이.

313230333030 이렇게 나옵니다.



쉽게 말해서. 같은 소스값인 120300을 숫자타입으로 hex 변환하는 것과 문자로서 보고 "120300" 을 string to hex 함수등으로 변환하면 서로 이렇게 다른 변환된 값이 나오는데요.


연계해야 하는 상대 시스템에서 보내준 스펙문서의 샘플로 변환된 16진수 값등을 보면. 저렇게 어떤 필드는 문자를 변환했을때처럼 31 32 30 33.. 이런식으로 되어 있고. 어떤 필드들은 00 01 D5 EC 이런식으로 숫자를 변환했을때로 되어있습니다.


이런 경우, 각 필드 타입에 맞춰서 16진수 변환도 바꿔서해야 할런지요? 이게 또 바이트배열에서 자릿수 맞춰들어가는 전문형태라 정확하게 바이트 배열상의 포지션이 또 맞아야 하거든요. 


조언 부탁드립니다. 감사합니다.


(참고로 사용중인 strongToHex 함수 첨부합니다.)

public static String stringToHex(String s) {

String result = "";

for (int i = 0; i < s.length(); i++) {

result += String.format("%02X ", (int) s.charAt(i));

}

   return result.replaceAll("\\p{Z}", "");

}

0
0
  • 답변 2

  • antop
    917
    2018-02-12 18:14:25

    당연히 1과 2는 결과가 다릅니다.


    1. 10진수 120300을 16진수로 변환 = 0001D5EC


    2. 문자열 "120300" 을 각각 자리마다 ASCII 10진수로 변환(char -> int) 후 16진수로 변환 = "313230333030"


    package test;
    
    import java.util.Arrays;
    
    public class Test {
    
    	public static void main(String[] args) {
    
    		String s = "120300";
    
    		System.out.println("input = " + s);
    
    		String result = stringToHex(s);
    
    		System.out.println("output = " + result);
    
    	}
    
    	public static String stringToHex(String s) {
    		String result = "";
    
    		// string -> char array
    		char[] chars = new char[s.length()];
    		for (int i = 0; i < s.length(); i++) {
    			chars[i] = s.charAt(i);
    		}
    		System.out.println("chars = " + Arrays.toString(chars));
    
    		// char -> int (ascii)
    		int[] ints = new int[chars.length];
    		for (int i = 0; i < chars.length; i++) {
    			ints[i] = (int) chars[i];
    		}
    		System.out.println("ints = " + Arrays.toString(ints));
    		
    		// int (dec) -> hex
    		String[] hex = new String[ints.length];
    		for (int i = 0; i < ints.length; i++) {
    			hex[i] = Integer.toHexString(ints[i]);
    		}
    		System.out.println("to x = " + Arrays.toString(hex));
    
    		for (String h : hex) {
    			result += h;
    		}
    		
    		return result;
    
    	}
    
    }

     

    1
  • 자바사춘기
    117
    2018-02-12 20:44:28

    답변감사드립니다.

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.