Tôi đang cố chuyển đổi một chuỗi như "testing123" thành dạng thập lục phân trong java. Tôi hiện đang sử dụng BlueJ.
Và để chuyển đổi nó trở lại, nó có giống nhau ngoại trừ lùi lại không?
Tôi đang cố chuyển đổi một chuỗi như "testing123" thành dạng thập lục phân trong java. Tôi hiện đang sử dụng BlueJ.
Và để chuyển đổi nó trở lại, nó có giống nhau ngoại trừ lùi lại không?
Câu trả lời:
Đây là một cách ngắn gọn để chuyển nó thành hex:
public String toHex(String arg) {
return String.format("%040x", new BigInteger(1, arg.getBytes(/*YOUR_CHARSET?*/)));
}
BigInteger(int,byte[])
tạo; ngược lại nếu byte đầu tiên là số âm, bạn sẽ nhận được BigInteger âm.
Để đảm bảo rằng hệ lục phân luôn dài 40 ký tự, BigInteger phải là số dương:
public String toHex(String arg) {
return String.format("%x", new BigInteger(1, arg.getBytes(/*YOUR_CHARSET?*/)));
}
byte[] data = { -1, 1 };
- mã trong câu trả lời này hoạt động tốt, trong khi đó với 17 phiếu ủng hộ không thành công.
-1
ra khỏi một chuỗi (như được yêu cầu trong ví dụ) không?
byte
s trong mảng của bạn.
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
Các số mà bạn mã hóa thành hệ thập lục phân phải đại diện cho một số mã hóa của các ký tự, chẳng hạn như UTF-8. Vì vậy, trước tiên hãy chuyển đổi Chuỗi thành một byte [] đại diện cho chuỗi trong bảng mã đó, sau đó chuyển đổi từng byte sang hệ thập lục phân.
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);
}
Sử dụng DatatypeConverter.printHexBinary()
:
public static String toHexadecimal(String text) throws UnsupportedEncodingException
{
byte[] myBytes = text.getBytes("UTF-8");
return DatatypeConverter.printHexBinary(myBytes);
}
Ví dụ sử dụng:
System.out.println(toHexadecimal("Hello StackOverflow"));
Bản in:
48656C6C6F20537461636B4F766572666C6F77
Lưu ý : Điều này gây ra thêm một chút rắc rối với Java 9
và mới hơn vì API không được bao gồm theo mặc định. Để tham khảo ví dụ như thấy này GitHub
vấn đề.
Đây là một giải pháp khác
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();
}
format("%02x")
để định dạng () luôn sử dụng 2 ký tự. Mặc dù ASCII là đôi chữ số hex tức là A = 0x65
Tất cả các câu trả lời dựa trên String.getBytes () liên quan đến việc mã hóa chuỗi của bạn theo một Charset. Bạn không nhất thiết phải nhận giá trị hex của các ký tự 2 byte tạo nên chuỗi của bạn. Nếu những gì bạn thực sự muốn tương đương với một trình xem hex, thì bạn cần truy cập trực tiếp vào các ký tự. Đây là chức năng mà tôi sử dụng trong mã của mình để gỡ lỗi các vấn đề Unicode:
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();
}
Sau đó, stringToHex ("testing123") sẽ cung cấp cho bạn:
0074 0065 0073 0074 0069 006e 0067 0031 0032 0033
byte[] bytes = string.getBytes(CHARSET); // you didn't say what charset you wanted
BigInteger bigInt = new BigInteger(bytes);
String hexString = bigInt.toString(16); // 16 is the radix
Bạn có thể quay lại hexString
tại thời điểm này, với cảnh báo rằng các ký tự null đứng đầu sẽ bị loại bỏ và kết quả sẽ có độ dài kỳ lạ nếu byte đầu tiên nhỏ hơn 16. Nếu bạn cần xử lý những trường hợp đó, bạn có thể thêm một số mã bổ sung để đệm bằng các số 0:
StringBuilder sb = new StringBuilder();
while ((sb.length() + hexString.length()) < (2 * bytes.length)) {
sb.append("0");
}
sb.append(hexString);
return sb.toString();
Để nhận giá trị Integer của hex
//hex like: 0xfff7931e to int
int hexInt = Long.decode(hexString).intValue();
Chuyển đổi một chữ cái trong mã hex và mã hex trong chữ cái.
String letter = "a";
String code;
int decimal;
code = Integer.toHexString(letter.charAt(0));
decimal = Integer.parseInt(code, 16);
System.out.println("Hex code to " + letter + " = " + code);
System.out.println("Char to " + code + " = " + (char) decimal);
Tôi sẽ đề xuất một cái gì đó như thế này, str
chuỗi đầu vào của bạn ở đâu :
StringBuffer hex = new StringBuffer();
char[] raw = tokens[0].toCharArray();
for (int i=0;i<raw.length;i++) {
if (raw[i]<=0x000F) { hex.append("000"); }
else if(raw[i]<=0x00FF) { hex.append("00" ); }
else if(raw[i]<=0x0FFF) { hex.append("0" ); }
hex.append(Integer.toHexString(raw[i]).toUpperCase());
}
Đầu tiên chuyển nó thành byte bằng cách sử dụng hàm getBytes () và sau đó chuyển nó thành hex usign như sau:
private static String hex(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (int i=0; i<bytes.length; i++) {
sb.append(String.format("%02X ",bytes[i]));
}
return sb.toString();
}
import java.io.*;
import java.util.*;
public class Exer5{
public String ConvertToHexadecimal(int num){
int r;
String bin="\0";
do{
r=num%16;
num=num/16;
if(r==10)
bin="A"+bin;
else if(r==11)
bin="B"+bin;
else if(r==12)
bin="C"+bin;
else if(r==13)
bin="D"+bin;
else if(r==14)
bin="E"+bin;
else if(r==15)
bin="F"+bin;
else
bin=r+bin;
}while(num!=0);
return bin;
}
public int ConvertFromHexadecimalToDecimal(String num){
int a;
int ctr=0;
double prod=0;
for(int i=num.length(); i>0; i--){
if(num.charAt(i-1)=='a'||num.charAt(i-1)=='A')
a=10;
else if(num.charAt(i-1)=='b'||num.charAt(i-1)=='B')
a=11;
else if(num.charAt(i-1)=='c'||num.charAt(i-1)=='C')
a=12;
else if(num.charAt(i-1)=='d'||num.charAt(i-1)=='D')
a=13;
else if(num.charAt(i-1)=='e'||num.charAt(i-1)=='E')
a=14;
else if(num.charAt(i-1)=='f'||num.charAt(i-1)=='F')
a=15;
else
a=Character.getNumericValue(num.charAt(i-1));
prod=prod+(a*Math.pow(16, ctr));
ctr++;
}
return (int)prod;
}
public static void main(String[] args){
Exer5 dh=new Exer5();
Scanner s=new Scanner(System.in);
int num;
String numS;
int choice;
System.out.println("Enter your desired choice:");
System.out.println("1 - DECIMAL TO HEXADECIMAL ");
System.out.println("2 - HEXADECIMAL TO DECIMAL ");
System.out.println("0 - EXIT ");
do{
System.out.print("\nEnter Choice: ");
choice=s.nextInt();
if(choice==1){
System.out.println("Enter decimal number: ");
num=s.nextInt();
System.out.println(dh.ConvertToHexadecimal(num));
}
else if(choice==2){
System.out.println("Enter hexadecimal number: ");
numS=s.next();
System.out.println(dh.ConvertFromHexadecimalToDecimal(numS));
}
}while(choice!=0);
}
}
Chuyển đổi chuỗi thành hệ thập lục phân :
public String hexToString(String hex) {
return Integer.toHexString(Integer.parseInt(hex));
}
chắc chắn đây là cách dễ dàng.
Sử dụng sự trợ giúp của Nhiều người từ nhiều Chủ đề ..
Tôi biết điều này đã được trả lời, nhưng tôi muốn cung cấp phương pháp mã hóa & giải mã đầy đủ cho bất kỳ người nào khác trong trường hợp tương tự của tôi ..
Đây là phương pháp Mã hóa & Giải mã của tôi ..
// Global Charset Encoding
public static Charset encodingType = StandardCharsets.UTF_8;
// Text To Hex
public static String textToHex(String text)
{
byte[] buf = null;
buf = text.getBytes(encodingType);
char[] HEX_CHARS = "0123456789abcdef".toCharArray();
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);
}
// Hex To Text
public static String hexToText(String hex)
{
int l = hex.length();
byte[] data = new byte[l / 2];
for (int i = 0; i < l; i += 2)
{
data[i / 2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4)
+ Character.digit(hex.charAt(i + 1), 16));
}
String st = new String(data, encodingType);
return st;
}
Tốt hơn nhiều:
public static String fromHexString(String hex, String sourceEncoding ) throws IOException{
ByteArrayOutputStream bout = new ByteArrayOutputStream();
byte[] buffer = new byte[512];
int _start=0;
for (int i = 0; i < hex.length(); i+=2) {
buffer[_start++] = (byte)Integer.parseInt(hex.substring(i, i + 2), 16);
if (_start >=buffer.length || i+2>=hex.length()) {
bout.write(buffer);
Arrays.fill(buffer, 0, buffer.length, (byte)0);
_start = 0;
}
}
return new String(bout.toByteArray(), sourceEncoding);
}
Dưới đây là một số điểm chuẩn so sánh các phương pháp tiếp cận và thư viện khác nhau. Ổi đánh bại Apache Commons Codec khi giải mã. Commons Codec đánh bại Guava khi mã hóa. Và JHex đánh bại chúng cả về giải mã và mã hóa.
String hexString = "596f752772652077656c636f6d652e";
byte[] decoded = JHex.decodeChecked(hexString);
System.out.println(new String(decoded));
String reEncoded = JHex.encode(decoded);
Mọi thứ đều nằm trong một tệp lớp duy nhất cho JHex . Hãy sao chép dán nếu bạn chưa muốn có một thư viện khác trong cây phụ thuộc của mình. Cũng lưu ý, nó chỉ khả dụng dưới dạng jar Java 9 cho đến khi tôi có thể tìm ra cách xuất bản nhiều mục tiêu phát hành với Gradle và plugin Bintray.
Một cách ngắn gọn và thuận tiện để chuyển đổi một Chuỗi sang ký hiệu Hệ thập lục phân của nó là:
public static void main(String... args){
String str = "Hello! This is test string.";
char ch[] = str.toCharArray();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < ch.length; i++) {
sb.append(Integer.toHexString((int) ch[i]));
}
System.out.println(sb.toString());
}
kiểm tra giải pháp này cho Chuỗi thành hex và hex thành Chuỗi ngược lại
public class TestHexConversion {
public static void main(String[] args) {
try{
String clearText = "testString For;0181;with.love";
System.out.println("Clear Text = " + clearText);
char[] chars = clearText.toCharArray();
StringBuffer hex = new StringBuffer();
for (int i = 0; i < chars.length; i++) {
hex.append(Integer.toHexString((int) chars[i]));
}
String hexText = hex.toString();
System.out.println("Hex Text = " + hexText);
String decodedText = HexToString(hexText);
System.out.println("Decoded Text = "+decodedText);
} catch (Exception e){
e.printStackTrace();
}
}
public static String HexToString(String hex){
StringBuilder finalString = new StringBuilder();
StringBuilder tempString = new StringBuilder();
for( int i=0; i<hex.length()-1; i+=2 ){
String output = hex.substring(i, (i + 2));
int decimal = Integer.parseInt(output, 16);
finalString.append((char)decimal);
tempString.append(decimal);
}
return finalString.toString();
}
Đầu ra như sau:
Clear Text = testString For; 0181; with.love
Văn bản hệ lục phân = 74657374537472696e6720466f723b303138313b776974682e6c6f7665
Văn bản được giải mã = testString For; 0181; with.love