“testing123″과 같은 문자열을 자바에서 16 진수 형식으로 변환하려고합니다. 현재 BlueJ를 사용하고 있습니다.
그리고 그것을 다시 변환하는 것은 역방향을 제외하고는 동일한 것입니까?
답변
다음은 16 진수로 변환하는 간단한 방법입니다.
public String toHex(String arg) {
return String.format("%040x", new BigInteger(1, arg.getBytes(/*YOUR_CHARSET?*/)));
}
답변
16 진수가 항상 40 자 길이인지 확인하려면 BigInteger가 양수 여야합니다.
public String toHex(String arg) {
return String.format("%x", new BigInteger(1, arg.getBytes(/*YOUR_CHARSET?*/)));
}
답변
import org.apache.commons.codec.binary.Hex;
...
String hexString = Hex.encodeHexString(myString.getBytes(/* charset */));
http://commons.apache.org/codec/apidocs/org/apache/commons/codec/binary/Hex.html
답변
16 진수로 인코딩하는 숫자는 UTF-8과 같은 문자의 일부 인코딩을 나타내야합니다. 따라서 먼저 문자열을 해당 인코딩의 문자열을 나타내는 byte []로 변환 한 다음 각 바이트를 16 진수로 변환합니다.
public static String hexadecimal(String input, String charsetName) throws UnsupportedEncodingException {
if (input == null) throw new NullPointerException();
return asHex(input.getBytes(charsetName));
}
private static final char[] HEX_CHARS = "0123456789abcdef".toCharArray();
public static String asHex(byte[] buf)
{
char[] chars = new char[2 * buf.length];
for (int i = 0; i < buf.length; ++i)
{
chars[2 * i] = HEX_CHARS[(buf[i] & 0xF0) >>> 4];
chars[2 * i + 1] = HEX_CHARS[buf[i] & 0x0F];
}
return new String(chars);
}
답변
사용 DatatypeConverter.printHexBinary()
:
public static String toHexadecimal(String text) throws UnsupportedEncodingException
{
byte[] myBytes = text.getBytes("UTF-8");
return DatatypeConverter.printHexBinary(myBytes);
}
사용 예 :
System.out.println(toHexadecimal("Hello StackOverflow"));
인쇄물:
48656C6C6F20537461636B4F766572666C6F77
참고 : Java 9
API가 기본적으로 포함되어 있지 않기 때문에 이로 인해 약간의 추가 문제가 발생합니다 . 참고 로이 GitHub
문제 를 참조하십시오 .
답변
여기에 다른 해결책
public static String toHexString(byte[] ba) {
StringBuilder str = new StringBuilder();
for(int i = 0; i < ba.length; i++)
str.append(String.format("%x", ba[i]));
return str.toString();
}
public static String fromHexString(String hex) {
StringBuilder str = new StringBuilder();
for (int i = 0; i < hex.length(); i+=2) {
str.append((char) Integer.parseInt(hex.substring(i, i + 2), 16));
}
return str.toString();
}
답변
String.getBytes () 기반의 모든 답변 에는 Charset에 따라 문자열을 인코딩 하는 것이 포함됩니다 . 문자열을 구성 하는 2 바이트 문자 의 16 진수 값을 반드시 얻을 필요는 없습니다 . 실제로 원하는 것이 16 진 뷰어와 동일하다면 문자에 직접 액세스해야합니다. 유니 코드 문제를 디버깅하기 위해 코드에서 사용하는 함수는 다음과 같습니다.
static String stringToHex(String string) {
StringBuilder buf = new StringBuilder(200);
for (char ch: string.toCharArray()) {
if (buf.length() > 0)
buf.append(' ');
buf.append(String.format("%04x", (int) ch));
}
return buf.toString();
}
그러면 stringToHex ( “testing123”)가 다음을 제공합니다.
0074 0065 0073 0074 0069 006e 0067 0031 0032 0033