আমি জাভাতে "টেস্টিং 123" এর মতো একটি স্ট্রিংকে হেক্সাডেসিমাল আকারে রূপান্তরিত করার চেষ্টা করছি। আমি বর্তমানে ব্লুজে ব্যবহার করছি।
এবং এটিকে আবার রূপান্তর করতে, পিছিয়ে পড়া বাদে কি একই জিনিস?
আমি জাভাতে "টেস্টিং 123" এর মতো একটি স্ট্রিংকে হেক্সাডেসিমাল আকারে রূপান্তরিত করার চেষ্টা করছি। আমি বর্তমানে ব্লুজে ব্যবহার করছি।
এবং এটিকে আবার রূপান্তর করতে, পিছিয়ে পড়া বাদে কি একই জিনিস?
উত্তর:
এটিকে হেক্সে রূপান্তর করার জন্য এখানে একটি ছোট্ট উপায়:
public String toHex(String arg) {
return String.format("%040x", new BigInteger(1, arg.getBytes(/*YOUR_CHARSET?*/)));
}
BigInteger(int,byte[])
কনস্ট্রাক্টর ব্যবহার করতে হবে ; অন্যথায় যদি প্রথম বাইটটি নেতিবাচক হয় তবে আপনি একটি নেতিবাচক বিগইন্টিজার পাবেন।
হেক্স সর্বদা 40 টি অক্ষর লম্বা হয় তা নিশ্চিত করতে, বিগইন্টিজারকে ইতিবাচক হতে হবে:
public String toHex(String arg) {
return String.format("%x", new BigInteger(1, arg.getBytes(/*YOUR_CHARSET?*/)));
}
byte[] data = { -1, 1 };
- এই উত্তরে কোডটি সূক্ষ্মভাবে কাজ করে, যখন এটির সাথে 17 টি upvotes ব্যর্থ হয়।
-1
স্ট্রিংয়ের বাইরে মান সহ একটি বাইট পাওয়া সম্ভব (উদাহরণস্বরূপ অনুরোধ করা হয়েছিল)?
byte
আপনার অ্যারের মধ্যে গুলি।
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
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();
}
format("%02x")
তাই ফর্ম্যাট ব্যবহার করব () সর্বদা 2 টি অক্ষর ব্যবহার করে। যদিও এএসসিআইআই হ'ল দ্বি সংখ্যার হেক্স অর্থাৎ এ = 0x65
স্ট্রিং.জেটবাইটস () এর উপর ভিত্তি করে সমস্ত উত্তর একটি চরসেট অনুসারে আপনার স্ট্রিংটিকে এনকোডিংয়ের সাথে জড়িত । অগত্যা আপনি আপনার স্ট্রিং তৈরি করে এমন 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();
}
তারপরে, স্ট্রিংটোহেক্স ("টেস্টিং 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);
}
বিভিন্ন পদ্ধতির এবং গ্রন্থাগারগুলির সাথে তুলনা করার জন্য এখানে কিছু মানদণ্ড রয়েছে । পেয়ারা ডিকোডিংয়ের সময় অ্যাপাচি কমন্স কোডেককে পরাজিত করে। কমন্স কোডেক এনকোডিংয়ে পেয়ারাটিকে পরাজিত করে। এবং জেএইচএক্স তাদের উভয়কে ডিকোডিং এবং এনকোডিংয়ের জন্য মারধর করে।
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
হেক্স পাঠ্য = 74657374537472696e6720466f723b303138313b776974682e6c6f7665
ডিকোডেড পাঠ্য = পরীক্ষার জন্য স্ট্রিং; 0181; with.love