জাভাতে একটি স্ট্রিংকে হেক্সাডেসিমালে রূপান্তর করা


107

আমি জাভাতে "টেস্টিং 123" এর মতো একটি স্ট্রিংকে হেক্সাডেসিমাল আকারে রূপান্তরিত করার চেষ্টা করছি। আমি বর্তমানে ব্লুজে ব্যবহার করছি।

এবং এটিকে আবার রূপান্তর করতে, পিছিয়ে পড়া বাদে কি একই জিনিস?

java  string  hex 

আপনার এতক্ষণের কোডটি দেখানোর জন্য দয়া করে আপনার প্রশ্নটি সম্পাদনা করুন । আপনার যে কোডটির সাথে সমস্যা হচ্ছে তার কমপক্ষে একটি আউটলাইন (তবে অগ্রাধিকারের জন্য একটি সর্বনিম্ন প্রজননযোগ্য উদাহরণ ) অন্তর্ভুক্ত করা উচিত , তবে আমরা নির্দিষ্ট সমস্যাটি নিয়ে সহায়তা করার চেষ্টা করতে পারি। আপনার জিজ্ঞাসা করা উচিত কিভাবে জিজ্ঞাসা
টবি স্পিড 12

উত্তর:


201

এটিকে হেক্সে রূপান্তর করার জন্য এখানে একটি ছোট্ট উপায়:

public String toHex(String arg) {
    return String.format("%040x", new BigInteger(1, arg.getBytes(/*YOUR_CHARSET?*/)));
}

24
3vilness এর সবচেয়ে খাঁটি নমুনায় +1 আমি দেখেছি: একটি বাইট থেকে রূপান্তর করতে একটি বিগইন্টেগার ব্যবহার করে [] ...
এডুয়ার্ডো কোস্টা

13
এটা ভালবাসা! কোনও লুপ নেই এবং কোনও বিট-ফ্লিপিং নেই। আমি আপনাকে 0xFF upvotes দিতে চাই :)
laker

5
40 টি অক্ষর নিশ্চিত করতে, আপনার শূন্য প্যাডিং যুক্ত করা উচিত: স্ট্রিং.ফর্ম্যাট ("% 040x", নতুন বিগইন্টিজার (arg.getBytes (/ * YOUR_CHARSET? * /))) রিটার্ন করুন;
রন

4
@ কালেব ফলস্বরূপ স্ট্রিংকে ফেরত রূপান্তর করতে যদি আপনার ধারণা থাকে? যদি, হ্যাঁ, আপনি আমাকে কিছু ইঙ্গিত দিতে পারেন? ধন্যবাদ!
আর্টেক্সারেক্সে

1
আপনাকে BigInteger(int,byte[])কনস্ট্রাক্টর ব্যবহার করতে হবে ; অন্যথায় যদি প্রথম বাইটটি নেতিবাচক হয় তবে আপনি একটি নেতিবাচক বিগইন্টিজার পাবেন।
Joni

62

হেক্স সর্বদা 40 টি অক্ষর লম্বা হয় তা নিশ্চিত করতে, বিগইন্টিজারকে ইতিবাচক হতে হবে:

public String toHex(String arg) {
  return String.format("%x", new BigInteger(1, arg.getBytes(/*YOUR_CHARSET?*/)));
}

1
এই পদ্ধতিটি আসলে সঠিক। চেষ্টা করুন byte[] data = { -1, 1 };- এই উত্তরে কোডটি সূক্ষ্মভাবে কাজ করে, যখন এটির সাথে 17 টি upvotes ব্যর্থ হয়।
হুডলেজেভ

1
-1স্ট্রিংয়ের বাইরে মান সহ একটি বাইট পাওয়া সম্ভব (উদাহরণস্বরূপ অনুরোধ করা হয়েছিল)?
কালেব পেডারসন

@KalebPederson হ্যাঁ। এটা খুব কঠিন না। । মনোনীত আপনার এনকোডিং তাহলে কি কোন চরিত্রের সবচেয়ে গুরুত্বপূর্ণ বিট ব্যবহার (বলে UTF- মত * না), আপনি নেতিবাচক আছে byteআপনার অ্যারের মধ্যে গুলি।
মনিকা এর মামলা মামলা

45
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


3
আকর্ষণীয়, যদি আপনি চাকাটি পুনরায় উদ্ভাবন করতে না চান।
ফেডেরিকো জাঙ্কান

3
@ মেলনিচলসনে বাইটে যাওয়ার জন্য হেক্সে একটি ডিকোডহেক্স ফাংশন রয়েছে []। আপনাকে এটি ব্যবহার করতে হবে কারণ কোনও র্যান্ডম এইচএক্স স্ট্রিং আপনার এনকোডিংয়ের একটি স্ট্রিংয়ে রূপান্তরিত হতে পারে বলে কোনও কিছুই গ্যারান্টি দেয় না।
BxlSofty

18

আপনি যে নম্বরগুলি হেক্সাডেসিমালে এনকোড করেছেন সেগুলি অবশ্যই ইউটিএফ -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);
}

এটি একটি আকর্ষণীয় সমাধান এবং এটি যা উপাত্তের ডিজিটাল উপস্থাপনের মূল দিকে আঘাত করে। আপনি দয়া করে ব্যাখ্যা করতে পারেন আপনি কী করছেন এবং আপনার সমাধানে "ম্যাজিক সংখ্যাগুলি" কী উপস্থাপন করে? কোনও আগন্তুক জানেন না যে >>> অপারেটরটির অর্থ কী, আমরা বিটওয়াইজ-এবং & 0xF0 এর মুখোশ সহ কেন ব্যবহার করি, বা চরগুলি অ্যারে [2 * buf.length] আকারের কেন।
বরিস

16

ব্যবহার 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 9APIটি ডিফল্টরূপে অন্তর্ভুক্ত না হওয়ায় এটি কিছুটা অতিরিক্ত সমস্যা এবং আরও নতুন সমস্যা সৃষ্টি করে। রেফারেন্সের জন্য যেমন এই GitHub সমস্যাটি দেখুন।


11

এখানে একটি অন্য সমাধান

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();
}

3
দুর্দান্ত তবে আমি format("%02x")তাই ফর্ম্যাট ব্যবহার করব () সর্বদা 2 টি অক্ষর ব্যবহার করে। যদিও এএসসিআইআই হ'ল দ্বি সংখ্যার হেক্স অর্থাৎ এ = 0x65
মাইক জোন্স

8

স্ট্রিং.জেটবাইটস () এর উপর ভিত্তি করে সমস্ত উত্তর একটি চরসেট অনুসারে আপনার স্ট্রিংটিকে এনকোডিংয়ের সাথে জড়িত । অগত্যা আপনি আপনার স্ট্রিং তৈরি করে এমন 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

আপনি যা চান তা জাভা চরিত্রগুলির অভ্যন্তরীণ উপস্থাপনা, যা ইউটিএফ -১ is, ইউনিকোডের একটি নির্দিষ্ট প্রতিনিধিত্ব দেখতে চাইলে এটি ঠিক আছে।
জোনাথন রোজেন

5
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();

5

হেক্সের পূর্ণসংখ্যা মান পেতে

        //hex like: 0xfff7931e to int
        int hexInt = Long.decode(hexString).intValue();

5

হেক্স কোডে একটি চিঠি এবং অক্ষরে হেক্স কোড রূপান্তর করুন।

        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);

5

আমি এই জাতীয় কিছু প্রস্তাব করব, 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());
}

সংশোধনের জন্য ধন্যবাদ, সফটওয়্যার বানর। আমি উত্তরটি লিখতে গিয়ে আমি অনেক ক্লান্ত হয়ে পড়েছিলাম এবং 'কাঁচা [i] <= 9' এর জন্য আমার পরীক্ষাটি যথেষ্ট অপর্যাপ্ত।
রডিয়ান

1
এটি সত্যিই ভাল কাজ করে, উত্পন্ন হেক্সটকে আবার স্ট্রিংয়ে ফেরত দেওয়ার কোনও উপায় আছে কি?

1
এই যেখানে str হয়?
বিশ্বনাথ লেকশমনান

3

প্রথমে 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();
}

3

অন্য পথে যেতে (হেক্স থেকে স্ট্রিং) আপনি ব্যবহার করতে পারেন

public String hexToString(String hex) {
    return new String(new BigInteger(hex, 16).toByteArray());
}

1
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);
    }
}


1

স্ট্রিংকে হেক্সাডেসিমালে রূপান্তর করুন :

public String hexToString(String hex) {
    return Integer.toHexString(Integer.parseInt(hex));
}

অবশ্যই এটি সহজ উপায়।


এটি কোনও সমাধান নয়। প্রশ্নটি জিজ্ঞাসা করছে যে কীভাবে একটি স্বেচ্ছাচারী স্ট্রিংয়ের বিষয়বস্তুর হেক্স উপস্থাপনা পাবেন এবং উদাহরণ হিসাবে "টেস্টিং 123" সরবরাহ করবেন ।
স্কোমিসা

1

একাধিক থ্রেড থেকে একাধিক লোকের সহায়তা ব্যবহার করা ..

আমি জানি যে এটির উত্তর দেওয়া হয়েছে, তবে আমি আমার একই পরিস্থিতিতে অন্য যে কোনও ব্যক্তির জন্য একটি সম্পূর্ণ এনকোড এবং ডিকোড পদ্ধতিটি দিতে চাই ..

এখানে আমার এনকোডিং এবং ডিকোডিং পদ্ধতিগুলি ..

// 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;
}

নিস! কেবল ১৩ লাইনে, ">>>" "" "হওয়া উচিত
স্পাইকায়ং

0

অনেক ভাল:

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);
}

0

বিভিন্ন পদ্ধতির এবং গ্রন্থাগারগুলির সাথে তুলনা করার জন্য এখানে কিছু মানদণ্ড রয়েছে । পেয়ারা ডিকোডিংয়ের সময় অ্যাপাচি কমন্স কোডেককে পরাজিত করে। কমন্স কোডেক এনকোডিংয়ে পেয়ারাটিকে পরাজিত করে। এবং জেএইচএক্স তাদের উভয়কে ডিকোডিং এবং এনকোডিংয়ের জন্য মারধর করে।

JHex উদাহরণ

String hexString = "596f752772652077656c636f6d652e";
byte[] decoded = JHex.decodeChecked(hexString);
System.out.println(new String(decoded));
String reEncoded = JHex.encode(decoded);

JHex- এর জন্য সমস্ত কিছুই একক শ্রেণীর ফাইলে । আপনি যদি আপনার নির্ভরতা গাছের অন্য কোনও লাইব্রেরি না চান তবে পেস্ট অনুলিপি করুন। আরও মনে রাখবেন, গ্রেডল এবং বিন্ট্রে প্লাগইন সহ একাধিক প্রকাশের লক্ষ্যমাত্রাগুলি কীভাবে প্রকাশ করতে হয় তা অবধি না জানানো পর্যন্ত এটি কেবল জাভা 9 জার হিসাবে উপলব্ধ।


0

কোনও স্ট্রিংকে তার হেক্সাডেসিমাল স্বরলিপিতে রূপান্তর করার একটি ছোট এবং সুবিধাজনক উপায় হ'ল:

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());
}

0

স্ট্রিং টু হেক্স এবং হেক্স থেকে স্ট্রিং উইজ-বিপরীতে এই সমাধানটি পরীক্ষা করে দেখুন

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.