मैं जावा में हेक्साडेसिमल रूप में "test123" जैसे एक स्ट्रिंग को बदलने की कोशिश कर रहा हूं। मैं वर्तमान में BlueJ का उपयोग कर रहा हूं।
और इसे वापस परिवर्तित करने के लिए, क्या यह पिछड़े को छोड़कर एक ही बात है?
मैं जावा में हेक्साडेसिमल रूप में "test123" जैसे एक स्ट्रिंग को बदलने की कोशिश कर रहा हूं। मैं वर्तमान में BlueJ का उपयोग कर रहा हूं।
और इसे वापस परिवर्तित करने के लिए, क्या यह पिछड़े को छोड़कर एक ही बात है?
जवाबों:
यहाँ इसे हेक्स में बदलने का एक छोटा तरीका है:
public String toHex(String arg) {
return String.format("%040x", new BigInteger(1, arg.getBytes(/*YOUR_CHARSET?*/)));
}
BigInteger(int,byte[])कंस्ट्रक्टर का उपयोग करना होगा ; अन्यथा यदि पहली बाइट ऋणात्मक है तो आपको एक नकारात्मक बिगइंटर मिलता है।
यह सुनिश्चित करने के लिए कि हेक्स हमेशा 40 वर्ण लंबा है, BigInteger को सकारात्मक होना चाहिए:
public String toHex(String arg) {
return String.format("%x", new BigInteger(1, arg.getBytes(/*YOUR_CHARSET?*/)));
}
byte[] data = { -1, 1 };- इस जवाब में कोड ठीक काम करता है, जबकि 17 अपवोट के साथ विफल रहता है।
-1एक स्ट्रिंग से मूल्य के साथ बाइट प्राप्त करना संभव है (उदाहरण में अनुरोध किया गया था)?
byteआपके सरणी में नकारात्मक s है।
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
संख्या जो आप हेक्साडेसिमल में एनकोड करते हैं, उसे वर्णों के कुछ एन्कोडिंग का प्रतिनिधित्व करना चाहिए, जैसे कि यूटीएफ -8। इसलिए पहले स्ट्रिंग को बाइट में परिवर्तित करें [] उस एन्कोडिंग में स्ट्रिंग का प्रतिनिधित्व करते हैं, फिर प्रत्येक बाइट को हेक्साडेसिमल में बदलते हैं।
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 एपीआई के डिफ़ॉल्ट रूप से शामिल नहीं होने के । संदर्भ के लिए उदाहरण के लिए इस 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();
}
format("%02x")इतना प्रारूप () हमेशा 2 वर्णों का उपयोग करता हूं । हालांकि ASCII डबल डिजिट हेक्स है, A = 0x65
String.getBytes () पर आधारित सभी उत्तरों में Charset के अनुसार आपके स्ट्रिंग को एन्कोड करना शामिल है । जरूरी नहीं कि आप अपने स्ट्रिंग बनाने वाले 2-बाइट वर्णों का हेक्स मान प्राप्त करें । यदि आप वास्तव में चाहते हैं कि एक हेक्स दर्शक के बराबर है, तो आपको सीधे वर्णों तक पहुंचने की आवश्यकता है। यहां वह फ़ंक्शन है जो मैं यूनिकोड मुद्दों को डीबग करने के लिए अपने कोड में उपयोग करता हूं:
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 ("टेस्टिंग123") आपको देगा:
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
आप hexStringइस बिंदु पर लौट सकते हैं , इस चेतावनी के साथ कि प्रमुख अशक्तियाँ छीन ली जाएंगी, और परिणाम में एक विषम लंबाई होगी यदि पहली बाइट 16 से कम है। यदि आपको उन मामलों को संभालने की आवश्यकता है, तो आप कुछ अतिरिक्त कोड जोड़ सकते हैं 0s के साथ पैड करने के लिए:
StringBuilder sb = new StringBuilder();
while ((sb.length() + hexString.length()) < (2 * bytes.length)) {
sb.append("0");
}
sb.append(hexString);
return sb.toString();
हेक्स के पूर्णांक मूल्य प्राप्त करने के लिए
//hex like: 0xfff7931e to int
int hexInt = Long.decode(hexString).intValue();
पत्र में हेक्स कोड और हेक्स कोड में एक पत्र में परिवर्तित करें।
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);
मैं कुछ इस तरह का सुझाव दूंगा, जहां strआपका इनपुट स्ट्रिंग है:
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());
}
पहले इसे getBytes () फ़ंक्शन का उपयोग करके बाइट में परिवर्तित करें और फिर इसे हेक्स usign में परिवर्तित करें:
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);
}
}
परिवर्तित स्ट्रिंग को हेक्साडेसिमल :
public String hexToString(String hex) {
return Integer.toHexString(Integer.parseInt(hex));
}
निश्चित रूप से यह आसान तरीका है।
मल्टीपल पीपल्स का उपयोग करने से कई थ्रेड्स की मदद मिलती है।
मुझे पता है कि यह उत्तर दिया गया है, लेकिन मैं अपनी उसी स्थिति में किसी अन्य के लिए पूर्ण सांकेतिक शब्दों में बदलना और डिकोड विधि देना चाहूंगा।
यहाँ मेरे एन्कोडिंग और डिकोडिंग के तरीके हैं ..
// 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;
}
काफी बेहतर:
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);
}
यहां कुछ दृष्टिकोण अलग-अलग दृष्टिकोणों और पुस्तकालयों की तुलना कर रहे हैं । अमरूद डिकोडिंग पर अपाचे कॉमन्स कोडेक को हराता है। कॉमन्स कोडेक एन्कोडिंग में अमरूद को हराता है। और JHEX डिकोडिंग और एन्कोडिंग दोनों के लिए उन्हें हरा देता है।
String hexString = "596f752772652077656c636f6d652e";
byte[] decoded = JHex.decodeChecked(hexString);
System.out.println(new String(decoded));
String reEncoded = JHex.encode(decoded);
सब कुछ JHex के लिए एक एकल वर्ग फ़ाइल में है । यदि आप अभी तक अपने निर्भरता के पेड़ में एक और पुस्तकालय नहीं चाहते हैं तो पेस्ट कॉपी करने के लिए स्वतंत्र महसूस करें। यह भी ध्यान दें, यह केवल जावा 9 जार के रूप में उपलब्ध है, जब तक मैं यह पता नहीं लगा सकता कि ग्रैडल और बिंट्रे प्लगइन के साथ कई रिलीज़ लक्ष्यों को कैसे प्रकाशित किया जाए।
स्ट्रिंग को अपने हेक्साडेसिमल संकेतन में बदलने का एक छोटा और सुविधाजनक तरीका है:
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());
}
स्ट्रिंग टू हेक्स और हेक्स टू स्ट्रिंग विसे-वर्सा के लिए इस समाधान की जाँच करें
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();
}
आउटपुट निम्नानुसार है:
क्लियर टेक्स्ट = टेस्टस्ट्रीमिंग फॉर; 0181; with.love
हेक्स पाठ = 67४६५47३45४47४47६६६६६६६६६६६६६६ परफोर्मा १३83३83३३३b३b३e६e६c६६६६६६६६65६65६६५
डिकोडेड पाठ = परीक्षण के लिए; 0181; with.love