কীভাবে বাইট অ্যারেটিকে তার সংখ্যাসূচক মান (জাভা) এ রূপান্তর করবেন?


91

আমার কাছে একটি 8 বাইট অ্যারে আছে এবং আমি এটির সাথে সম্পর্কিত সংখ্যার মানতে রূপান্তর করতে চাই।

যেমন

byte[] by = new byte[8];  // the byte array is stored in 'by'

// CONVERSION OPERATION
// return the numeric value

আমি এমন একটি পদ্ধতি চাই যা উপরের রূপান্তর ক্রিয়াকলাপটি সম্পাদন করবে।


4
"সংখ্যার মান" বলতে কী বোঝ? বাইটগুলি বাইনারিটিতে কোনও পূর্ণসংখ্যা (দীর্ঘ) বা ভাসমান পয়েন্ট সংখ্যা (ডাবল) উপস্থাপন করে? তারা কি কোনও সংখ্যার স্ট্রিং প্রতিনিধিত্ব করে? নাকি আরও একটি উপস্থাপনা?
স্টার ব্লু

4
এই ছিল সহায়ক stackoverflow.com/questions/5399798/...
TacB0sS

এনবি: ট্যাকবি0 এসএসের লিঙ্কটি আমি আসলে যা খুঁজছিলাম তা ছিল- উভয়ই এগিয়ে এবং পিছনের দিকে রূপান্তর।
জে টেলর

new BigInteger(by).longValue()
ব্যবহারকারী 207421

উত্তর:


108

প্রথম বাইট ধরে নেওয়া সবচেয়ে কম তাৎপর্যপূর্ণ বাইট:

long value = 0;
for (int i = 0; i < by.length; i++)
{
   value += ((long) by[i] & 0xffL) << (8 * i);
}

প্রথম বাইটটি কি সর্বাধিক তাৎপর্যপূর্ণ, তবে এটি কিছুটা আলাদা:

long value = 0;
for (int i = 0; i < by.length; i++)
{
   value = (value << 8) + (by[i] & 0xff);
}

আপনার কাছে 8 টি বাইটের বেশি থাকলে বিগইন্টিজারের সাথে দীর্ঘস্থায়ী প্রতিস্থাপন করুন ।

আমার ত্রুটিগুলির সংশোধন করার জন্য অ্যারন ডিগুল্লাকে ধন্যবাদ।


8
-১ বাইটে স্বাক্ষরিত মান! এবং পাও () এর সাথে শিফ্ট (<<) প্রতিস্থাপন করুন! "মান = (মান << 8) + (([আমি] ও 0 এক্সএফ দ্বারা))"
অ্যারন দিগুলা

শিফট অপারেটরের (<<) ডান থেকে বাম অগ্রাধিকার আছে? উপরের কোডটি কীভাবে কাজ করে? এটা আমার জন্য সব ঠিক আছে। শুধু কাজ জানতে চান। থানেক্স অগ্রিম
সুরজ

@ মনমেন্টঃ শিফট অপারেটরের (<<) ডান থেকে বাম অগ্রাধিকার আছে? উপরের কোডটি কীভাবে কাজ করে? এটা আমার জন্য সব ঠিক আছে। শুধু কাজ জানতে চান। থানাক্স অগ্রিম
সুরজ

4
যদি অন্য কারও ক্ষেত্রে আমার একই সমস্যা থাকে তবে প্রথম উদাহরণে, [i] দ্বারা আপনাকে অবশ্যই দীর্ঘ সময় দিতে হবে, অন্যথায় এটি কেবল 2 ^ 32 এর চেয়ে কম মানের জন্য কাজ করে। এটি হ'লvalue += ((long)by[i] & 0xffL) << (8 * i);
লুক

115

রূপান্তর সম্পাদনের জন্য প্যাকেজের Bufferঅংশ হিসাবে সরবরাহ করা একটি ব্যবহার করতে পারে java.nio

এখানে, উত্স byte[]অ্যারের দৈর্ঘ্য 8 রয়েছে, যা আকারের সাথে longমানের সাথে মিলিত হয়।

প্রথমে byte[]অ্যারেটি একটিতে আবৃত হয় ByteBufferএবং তারপরে মানটি ByteBuffer.getLongঅর্জনের জন্য পদ্ধতিটি বলা longহয়:

ByteBuffer bb = ByteBuffer.wrap(new byte[] {0, 0, 0, 0, 0, 0, 0, 4});
long l = bb.getLong();

System.out.println(l);

ফলাফল

4

ByteBuffer.getLongমন্তব্যে পদ্ধতিটি নির্দেশ করার জন্য আমি ডিএফএকে ধন্যবাদ জানাতে চাই ।


যদিও এই পরিস্থিতিতে এটি প্রযোজ্য নাও হতে পারে তবে এর সৌন্দর্য Bufferএকাধিক মান সহ একটি অ্যারে দেখে আসে।

উদাহরণস্বরূপ, যদি আমাদের কাছে 8 বাইট অ্যারে থাকে এবং আমরা এটি দুটি intমান হিসাবে দেখতে চাই , আমরা byte[]অ্যারেটিকে একটিতে আবৃত করতে পারি ByteBuffer, যা একটি হিসাবে দেখা হয় IntBufferএবং এর দ্বারা মানগুলি পাওয়া যায় IntBuffer.get:

ByteBuffer bb = ByteBuffer.wrap(new byte[] {0, 0, 0, 1, 0, 0, 0, 4});
IntBuffer ib = bb.asIntBuffer();
int i0 = ib.get(0);
int i1 = ib.get(1);

System.out.println(i0);
System.out.println(i1);

ফলাফল:

1
4

বাইটবফার.আর্যাপ (নতুন বাইট [] {0, 0, 0, 1, 0, 0, 0, 4}) সম্পর্কে কী? getLong ()? এই পদ্ধতি পরবর্তী 8 বাইট পড়া এবং একটি দীর্ঘ তাদের রূপান্তর করা উচিত
DFA

@ ডিএফএ: এটি উল্লেখ করার জন্য ধন্যবাদ, এটি নিশ্চিতভাবে কাজ করে বলে মনে হচ্ছে - আমি উত্তরটি সম্পাদনা করব। :)
কুকিবার্ড

16

এটি যদি 8-বাইটের সংখ্যাসূচক মান হয় তবে আপনি চেষ্টা করতে পারেন:

BigInteger n = new BigInteger(byteArray);

এটি যদি কোনও ইউটিএফ -8 অক্ষর বাফার হয় তবে আপনি চেষ্টা করতে পারেন:

BigInteger n = new BigInteger(new String(byteArray, "UTF-8"));

আমি যদি এই উত্তরটির পক্ষে প্রথম কোড স্নিপেটের ঠিক পরে শেষ হয়ে গিয়েছিলাম বা স্ট্রিংটিকে "সংখ্যাসম্য" হিসাবে রূপান্তর করতে কিছু কোড অন্তর্ভুক্ত করেছিলাম তবে আমি এই উত্তরটির পক্ষে ভোট দিয়েছি। যেমনটি হ'ল, আপনার উত্তরটির দ্বিতীয়ার্ধটি একটি সিকুইটুর মতো বলে মনে হচ্ছে।
লরেন্স গনসাল্ভেস

প্রথম স্থানে আমি যা বোঝাতে চেয়েছি তা নয়, আমি আমার উত্তরটি পরিবর্তন করেছি
ভিনসেন্ট রবার্ট

15

সহজভাবে, আপনি গুগল দ্বারা সরবরাহিত পেয়ারা লিব ব্যবহার করতে পারেন বা উল্লেখ করতে পারেন , যা দীর্ঘ এবং বাইট অ্যারের মধ্যে রূপান্তর জন্য utiliy পদ্ধতি সরবরাহ করে। আমার ক্লায়েন্ট কোড:

    long content = 212000607777l;
    byte[] numberByte = Longs.toByteArray(content);
    logger.info(Longs.fromByteArray(numberByte));


9

পরিবর্তনশীল দৈর্ঘ্যের বাইটের জন্য আপনি বিগইন্টিজারও ব্যবহার করতে পারেন। আপনি এটিকে লম্বা, পূর্ণসংখ্যা বা সংক্ষিপ্ত রূপে রূপান্তর করতে পারেন, যে কোনও আপনার প্রয়োজন অনুসারে।

new BigInteger(bytes).intValue();

বা পোলারিটি বোঝাতে:

new BigInteger(1, bytes).intValue();


1

অ্যারের প্রতিটি কক্ষ স্বাক্ষরবিহীন int হিসাবে গণ্য করা হয়:

private int unsignedIntFromByteArray(byte[] bytes) {
int res = 0;
if (bytes == null)
    return res;


for (int i=0;i<bytes.length;i++){
    res = res | ((bytes[i] & 0xff) << i*8);
}
return res;
}

আমি 0xFFL ব্যবহার করা দরকার তা কেবল একটি নোট, অন্যথায় আমি 0xFFL থেকে দীর্ঘ পর্যন্ত কাস্টটিতে দীর্ঘ 1 বিট সেট রেখেছিলাম যখন আমি Long.toHexString (l) মুদ্রণ করি।
লুক 16

আপনাকে 0xFFL ব্যবহার করতে হবে অন্যথায় আপনি সাইন এক্সটেনশান পান।
ধূসর

0
public static long byteArrayToLong(byte[] bytes) {
    return ((long) (bytes[0]) << 56)
            + (((long) bytes[1] & 0xFF) << 48)
            + ((long) (bytes[2] & 0xFF) << 40)
            + ((long) (bytes[3] & 0xFF) << 32)
            + ((long) (bytes[4] & 0xFF) << 24)
            + ((bytes[5] & 0xFF) << 16)
            + ((bytes[6] & 0xFF) << 8)
            + (bytes[7] & 0xFF);
}

বাইট অ্যারে (দীর্ঘ 8 বাইট) দীর্ঘকে রূপান্তর করুন

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