হেক্স স্ট্রিংকে ইনটে রূপান্তর করুন


111

আমি হেক্স কোডের 8 টি অক্ষরের দীর্ঘ একটি স্ট্রিংটিকে একটি পূর্ণসংখ্যার সাথে রূপান্তর করার চেষ্টা করছি যাতে আমি স্ট্রিংয়ের তুলনায় অনেকগুলি পৃথক মানের চেয়ে তুলনা করতে পারি।

আমি জানি এটি সি ++ এ মোটামুটি তুচ্ছ তবে জাভাতে আমার এটি করা দরকার। আমার যে পরীক্ষার কেসটি সন্তুষ্ট করতে হবে তা হ'ল মূলত "AA0F245C" ইনটিকে রূপান্তর করা এবং তারপরে সেই স্ট্রিংয়ে ফিরে যাওয়া যাতে আমি জানি যে এটি সঠিক রূপান্তর করছে।

আমি নিম্নলিখিত চেষ্টা করেছি:

int decode = Integer.decode("0xAA0F245C");  // NumberFormatException
int decode2 = Integer.decode("AA0F245C"); //NumberFormatException
int parseInt = Integer.parseInt("AA0F245C", 16); //NumberFormatException
int valueOf = Integer.valueOf("AA0F245C", 16); //NumberFormatException

আমি এটি একবারে দুটি অক্ষর করেও ফলাফলগুলি বহুগুণে নেওয়ার চেষ্টা করেছি, যা রূপান্তরটি কাজ করে তবে সংখ্যাটি সঠিক নয়।

int id = 0;
for (int h = 0; h < hex.length(); h= h+2)
{
    String sub = hex.subSequence(h, h+2).toString();

if (id == 0)
    id = Integer.valueOf(sub, 16);
else
    id *= Integer.valueOf(sub, 16);             
 }
//ID = 8445600 which = 80DEA0 if I convert it back. 

আপনি যেমন জানেন তেমন আমি তৃতীয় পক্ষের গ্রন্থাগারগুলি ব্যবহার করতে পারি না, সুতরাং এটি জাভা স্ট্যান্ডার্ড লাইব্রেরিতে করা উচিত।

তোমার সাহায্যের জন্য অগ্রীম ধন্যবাদ.


যখন আপনি স্থানান্তরিত করা উচিত তখন আপনি গুণ করছেন।
নাথন মoinনভাজিরী

7
0xAA0F245C = 2853119068তবেInteger.MAX_VALUE = 0x7fffffff = 2147483647
সেশেমো

5
আমি জানি প্রশ্নটি প্রায় দুই বছর ধরে রয়েছে। তবে জাভা 8 আরও একটি সমাধান সক্ষম করে। তারা Integer.parseUnsignedInt("value",radix)আপনার উদ্দেশ্যটি পরিবেশন করে এমন পদ্ধতিটি যুক্ত করেছে । মানটি যদি এর চেয়ে বেশি হয় Integer.MAX_VALUEতবে negativeণাত্মক সংখ্যায় ম্যাপ করা হয়।
জন

উত্তর:


151

এটি কোনও ইন্টার (যা 4 বাইট এবং স্বাক্ষরযুক্ত) জন্য খুব সহজ।

ব্যবহার

Long.parseLong("AA0F245C", 16);

4
দুর্দান্ত আপনাকে ধন্যবাদ! আমার সম্ভবত এটি জানা উচিত ছিল। তবে এটি পোস্ট করার আগে আমি যে 4 জন ব্যক্তিকে জিজ্ঞাসা করেছি তারা কেউই এটি জানত না তাদের মধ্যে আমার কোনওটিই ভাল বোধ করে না :) পার্শ্ব নোট হিসাবে, আমাকে এখন বুঝতে হবে যে ব্যক্তি সেই কোডটি কেন লিখেছিল যে আমাকে ইনটগুলিকে অন্তর্নিহিত হিসাবে নয় এবং দীর্ঘায়িত হিসাবে তুলনা করা দরকার ... যার অর্থ সম্ভবত অন্য কিছু বন্ধ রয়েছে। এটি বিন্দু ছাড়াও ... দ্রুত উত্তর দেওয়ার জন্য আপনাকে ধন্যবাদ !!!! আপনার ভয়াবহ ত্রুটির বার্তার জন্য আপনাকে জাভাতে অভিশাপ দিন ... "এটি টু বিগ" সহায়ক হত।
রোলোক

আমি যখন বড় হেক্স স্ট্রিং দিয়ে চেষ্টা করি তখন আমি পাই NumberFormatException: For input string: "AF0005E2A6C630059E4754B8799360F5"... সমাধান?
আনম শেরাজ 25'18

@ আনমশেরাজ আপনি একটি দীর্ঘ কিন্তু বাইট অ্যারে রূপান্তর করতে চান না। উদাহরণস্বরূপ দেখুন
স্ট্যাকওভারফ্লো.com/ জিজ্ঞাসাগুলি /

একটি বিশাল সংখ্যার জন্য বাইট অ্যারেতে রূপান্তর করার বিকল্পটি BigIntegerএই জাতীয় ক্লাসটি ব্যবহার করা :BigInteger value = new BigInteger(valueString, 16)
জাভারু

33

আপনি এটি ব্যবহার করতে পারেন

System.out.println(Integer.decode("0x4d2"))    // output 1234
//and vice versa 
System.out.println(Integer.toHexString(1234); //  output is 4d2);

1
আমি এই উত্তরটি পছন্দ করি, ইন্টিজার ক্লাসে এর জন্য জেনেরিক, টাইপ-সংবেদনশীল পদ্ধতি আছে তা আমি জানতাম না। জ্ঞানের জন্য ধন্যবাদ
গিউউর

18

একটি জাভা Integerহ্যান্ডেল করতে পারে এমন সর্বাধিক মান 2147483657 বা 2 ^ 31-1। হেক্সাডেসিমাল সংখ্যা AA0F245C দশমিক সংখ্যা হিসাবে 2853119068 এবং এটি অনেক বেশি বড়, সুতরাং আপনাকে ব্যবহার করা দরকার

Long.parseLong("AA0F245C", 16);

এটা কাজ করতে.


বন্ধ: আকর্ষণীয় যে আরও 5 মিনিট পরে আরও বিশদ উত্তর 14 এর তুলনায় মাত্র 1 টি আপগোট পায়। যদিও সত্য, তবে এই জাদুকরী '4 বাইট' এবং 'স্বাক্ষরিত' বলেছেন না ... এইচএম।
n611x007


5

এটি সঠিক উত্তর:

myPassedColor = "#ffff8c85" int colorInt = Color.parseColor(myPassedColor)


3

আপনাদের মধ্যে যাদের দু'চরিত্রের স্ট্রিং থেকে স্বাক্ষরিত বাইটের হেক্সাডেসিমাল উপস্থাপনাকে বাইটে রূপান্তর করতে হবে (যা জাভাতে সর্বদা স্বাক্ষরিত থাকে) এর উদাহরণ রয়েছে। একটি হেক্সাডেসিমাল স্ট্রিং পার্স করা কখনই নেতিবাচক সংখ্যা দেয় না, যা ত্রুটিযুক্ত, কারণ 0xFF কিছু দৃষ্টিকোণ থেকে -1 হয় (দু'জনের পরিপূরক কোডিং)। নীতিটি হ'ল আগত স্ট্রিংটি ইন্ট হিসাবে পার্স করা যা বাইটের চেয়ে বড় এবং তারপরে নেতিবাচক সংখ্যার চারপাশে মোড়ানো। আমি কেবল বাইট দেখছি, সুতরাং উদাহরণটি যথেষ্ট ছোট।

String inputTwoCharHex="FE"; //whatever your microcontroller data is

int i=Integer.parseInt(inputTwoCharHex,16);
//negative numbers is i now look like 128...255

// shortly i>=128
if (i>=Integer.parseInt("80",16)){

    //need to wrap-around negative numbers
    //we know that FF is 255 which is -1
    //and FE is 254 which is -2 and so on
    i=-1-Integer.parseInt("FF",16)+i;
    //shortly i=-256+i;
}
byte b=(byte)i;
//b is now surely between -128 and +127

দীর্ঘ সংখ্যক প্রক্রিয়া করার জন্য এটি সম্পাদনা করা যেতে পারে। যথাক্রমে আরও বেশি এফএফ বা 00 যোগ করুন। ৮ টি হেক্স-চরিত্রের স্বাক্ষরিত পূর্ণসংখ্যার পার্সিংয়ের জন্য আপনাকে লং.পার্সলং ব্যবহার করতে হবে, কারণ এফএফএফএফ-এফএফএফএফ, যা পূর্ণসংখ্যা -1 হয়, কোনও ধনাত্মক সংখ্যা হিসাবে উপস্থাপিত হলে (4294967295 দেয়) পূর্ণসংখ্যায় ফিট করে না। সুতরাং এটি সংরক্ষণ করার জন্য আপনার দীর্ঘ প্রয়োজন। Negativeণাত্মক সংখ্যায় রূপান্তর এবং পূর্বে পূর্ণসংখ্যায় কাস্টিংয়ের পরে, এটি উপযুক্ত হবে। কোনও 8 টি অক্ষরের হেক্স স্ট্রিং নেই যা শেষ পর্যন্ত পূর্ণসংখ্যায় ফিট করে না।


1

প্রস্তাবিতদের অতিরিক্ত বিকল্প হ'ল BigIntegerক্লাসটি ব্যবহার করা । যেহেতু হেক্স মানগুলি প্রায়শই বড় সংখ্যা, যেমন sha256 বা sha512 মানগুলি হয় তাই এগুলি সহজেই একটি intএবং এ উপচে পড়বে long। বাইট অ্যারেতে রূপান্তর করা অন্য বিকল্পগুলির মতো একটি বিকল্প BigInterger, জাভাতে প্রায়শই ভুলে যাওয়া শ্রেণিটিও একটি বিকল্প।

String sha256 = "65f4b384672c2776116d8d6533c69d4b19d140ddec5c191ea4d2cfad7d025ca2";
BigInteger value = new BigInteger(sha256, 16);
System.out.println("value = " + value);
// 46115947372890196580627454674591875001875183744738980595815219240926424751266


0

এটি দিয়ে চেষ্টা করুন:

দীর্ঘ abc = রূপান্তরিত স্ট্রিং 2 হেক্স ("1A2A3B");

private  long  convertString2Hex(String numberHexString)
{
    char[] ChaArray = numberHexString.toCharArray();
    long HexSum=0;
    long cChar =0;

    for(int i=0;i<numberHexString.length();i++ )
    {
        if( (ChaArray[i]>='0') && (ChaArray[i]<='9') )
            cChar = ChaArray[i] - '0';
        else
            cChar = ChaArray[i]-'A'+10;
        HexSum = 16 * HexSum + cChar;
    }
    return  HexSum;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.