2012-11-01 6 views
-1

바이트로 내 16 진수 문자열을 변환하고 바이트 배열에 저장하고 싶습니다. 인터넷에서 코드를보고 내 program.But에 적응하려고했지만 완전히 손실되었습니다. 나는 꽤 새로운 java.Could 일부 내 전환 작업을 도와주세요. 아래 코드는 내가 쓴 것입니다. 는문자열을 바이트 배열로 변환합니다.

public class Main { 

    static String s = "00e83901c829e3735cc04137f3598a2b565c67665446d46ee74a6fd4ff8f556c7272fb6aeda45a757639aee558b130442fd4ff3f5cf98a08d0da6a23216d192dfd24bdda08a0b1081ae59fba0ae1516a2e02989df6b17a513b08895705552950e14fe430da3eae58fcc70619a129b534bbed6a9abc39706b1884b85a628781a86cc5223f038a7c0b48e1cf94033f7c5f1637900559b38fe2ccf41a14df5b8d81388fcebc69b59f7bc85a1c3e8b34a6deeb04a1e7fb1d3a7ae59009ea002aaa6ba5cdb9fa45653ac5eb89f61d436934f992197dbdb4c4a212cd7fbcd231debda57f11943b7f66215ecd616a4eed13fc9e38cd41d571b9faf496053b50a50321a076393ad91832959347f1fe5efd18e6267377108382fd992216a439ddc3dc59ce0ea955de95db767de4877caeaf8c7c4718e906d59db492cd610e7a28056f"; 

    public static void main(String[] args) { 
    } 

    private static 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; 

    } 
} 
+0

이 프로그램에 어떤 문제 (질문에 대한 정답은 main 메소드를 작성하는 경우, 정답과 다른 반응 중 하나를 선택하십시오)? 뭐가 문제 야? –

+0

내 콘솔에서 해당 바이트 값을 가져오고 싶습니다. 어떻게 표시합니까? –

+0

글쎄, 정확히 얼마나 바이트를 인쇄 할 것으로 기대합니까? 목록과 같이 :'{0, 100, -20, ...}'? –

답변

0

당신은 간단한 유틸리티 클래스 체크 here이 필요합니다 감사합니다. 다음은 hex string에서 byte[]으로 변환 한 다음 hex string으로 변환 한 다음 변환이 좋은지 비교하는 예제입니다.

public class Test { 

public static void main(String[] args) { 
    String str = "00e83901c829e3735cc04137f3598a2b565c67665446d46ee74a6fd4ff8f556c7272fb6aeda45a757639aee558b130442fd4ff3f5cf98a08d0da6a23216d192dfd24bdda08a0b1081ae59fba0ae1516a2e02989df6b17a513b08895705552950e14fe430da3eae58fcc70619a129b534bbed6a9abc39706b1884b85a628781a86cc5223f038a7c0b48e1cf94033f7c5f1637900559b38fe2ccf41a14df5b8d81388fcebc69b59f7bc85a1c3e8b34a6deeb04a1e7fb1d3a7ae59009ea002aaa6ba5cdb9fa45653ac5eb89f61d436934f992197dbdb4c4a212cd7fbcd231debda57f11943b7f66215ecd616a4eed13fc9e38cd41d571b9faf496053b50a50321a076393ad91832959347f1fe5efd18e6267377108382fd992216a439ddc3dc59ce0ea955de95db767de4877caeaf8c7c4718e906d59db492cd610e7a28056f"; 
    String str1 = new String(encodeHex(hexStringToByteArray(str))); 
    if (str1.equals(str)) { 
     System.out.println("String matches "); 
    } 
} 

public static byte[] hexStringToByteArray(String str) { 

    char[] data = str.toCharArray(); 
    int len = data.length; 
    byte[] out = new byte[len >> 1]; 
    for (int i = 0, j = 0; j < len; i++) { 
     int f = Character.digit(data[j], 16) << 4; 
     j++; 
     f = f | Character.digit(data[j], 16); 
     j++; 
     out[i] = (byte) (f & 0xFF); 
    } 
    return out; 
} 

public static char[] encodeHex(byte[] data) { 

    int l = data.length; 
    char[] out = new char[l << 1]; 
    for (int i = 0, j = 0; i < l; i++) { 
     out[j++] = DIGITS[(0xF0 & data[i]) >>> 4]; 
     out[j++] = DIGITS[0x0F & data[i]]; 
    } 

    return out; 
} 

private static final char[] DIGITS = { '0', '1', '2', '3', '4', '5', '6', 
     '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; 
} 

출력 : 당신이 메소드를 호출하면

String matches 
2

코드가 작동합니다.

public static void main(String[] args) { 
    String s="00e83901c829e3735cc04137f3598a2b565c67665446d46ee74a6fd4ff8f556c7272fb6aeda45a757639aee558b130442fd4ff3f5cf98a08d0da6a23216d192dfd24bdda08a0b1081ae59fba0ae1516a2e02989df6b17a513b08895705552950e14fe430da3eae58fcc70619a129b534bbed6a9abc39706b1884b85a628781a86cc5223f038a7c0b48e1cf94033f7c5f1637900559b38fe2ccf41a14df5b8d81388fcebc69b59f7bc85a1c3e8b34a6deeb04a1e7fb1d3a7ae59009ea002aaa6ba5cdb9fa45653ac5eb89f61d436934f992197dbdb4c4a212cd7fbcd231debda57f11943b7f66215ecd616a4eed13fc9e38cd41d571b9faf496053b50a50321a076393ad91832959347f1fe5efd18e6267377108382fd992216a439ddc3dc59ce0ea955de95db767de4877caeaf8c7c4718e906d59db492cd610e7a28056f"; 
    byte[] b = hexStringToByteArray(s); 
    System.out.println(b); 

    //edit: 
    System.out.println(Arrays.toString(b)); 
} 
+0

[B @ 1e63e3d --- 내 콘솔에 표시되는 내용이 이미 이전에 있습니다. 그것은 마지막 바이트 값의 위치이며 모든 바이트 값 자체는 아닙니다. 바이트 배열의 모든 위치에서 해당 바이트 값이 필요합니다. –

+0

내 대답이 업데이트되었습니다. – ChrisThompson

0

Java 프로그램을 실행할 때 main 메소드를 호출 할 때, 그리고 비어있는 경우에. main 메소드에서 메소드를 호출해야합니다. 정적 hexStringToByteArray 메소드를 가지고 있으므로 이것을 다음과 같이 호출 할 수 있습니다.

public static void main(String[] args) { 

    hexStringToByteArray(s); 

    } 
0

나는 더 잘 읽어야합니다. 귀하의 질문은 전환에 관한 것이라고 생각했지만 지금은 디스플레이에 관한 것이라고 생각합니다. 그것이 디스플레이에 관한 것이라면, 여기있는 다른 사람들은 당신이 당신의 주된 방법 (마술이 일어나는 곳)에서 아무것도 부르지 않는다는 것을 언급했다. 그것이 전환에 관한 것이라면, BigInterger는 당신을 위해 힘든 일을 할 수 있습니다. 다만의 경우 : 이것은 작동 할 것입니다 (마지막 5 줄은 출력이 입력과 일치하는지 확인하는 것입니다).

public static void main(String[] args) { 
    byte[] bytes = new BigInteger(s, 16).toByteArray(); 
    System.out.println(Arrays.toString(bytes)); 

    List<String> hexToCheck = new ArrayList<String>(bytes.length); 
    for (byte b : bytes) { 
     hexToCheck.add(String.format("%02X", b)); 
    } 
    System.out.println(hexToCheck); 
} 

관련 문제