كيفية تحويل صفيف بايت إلى قيمة رقمية لها (جافا)؟

StackOverflow https://stackoverflow.com/questions/1026761

سؤال

ولدي مجموعة 8 بايت وأريد تحويله إلى قيمة رقمية المقابلة لها.

ومنها مثلا.

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

// CONVERSION OPERATION
// return the numeric value

وأريد طريقة من شأنها أن تؤدي عملية التحويل المذكورة أعلاه.

هل كانت مفيدة؟

المحلول

وعلى افتراض أن البايت الأول هو أقل بايت كبير:

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

واستبدال طويلة مع BigInteger أو إذا لديك أكثر من 8 بايت.

وبفضل هارون Digulla لتصحيح أخطائي.

نصائح أخرى

ويمكن للمرء أن استخدام 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 في التعليقات.


وعلى الرغم من أنها قد لا تكون قابلة للتطبيق في هذه الحالة، جمال Buffers تأتي مع النظر في صفيف مع قيم متعددة.

وعلى سبيل المثال، إذا كان لدينا مجموعة 8 بايت، وكنا نرغب في مشاهدته كما قيمتين int، يمكننا أن التفاف مجموعة byte[] في ByteBuffer، الذي ينظر إليه على أنه <في أ href = "HTTP: // جافا .sun.com / javase / 6 / مستندات / المعهد / جافا / NIO / IntBuffer.html "يختلط =" noreferrer "> IntBuffer و الحصول على القيم التي كتبها <وأ href =" HTTP: //java.sun. كوم / javase / 6 / مستندات / المعهد / جافا / NIO / IntBuffer.html # الحصول على (الباحث) "يختلط =" noreferrer "> 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

وإذا كان هذا هو قيمة رقمية 8 بايت، يمكنك أن تجرب:

BigInteger n = new BigInteger(byteArray);

وإذا كان هذا هو وجود مخزن مؤقت حرف UTF-8، ثم يمكنك أن تجرب:

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

وببساطة، هل يمكن استخدام أو الرجوع إلى <م> الجوافة ليب التي تقدمها جوجل، والذي يقدم أساليب utiliy للتحويل بين مجموعة طويلة وبايت. بلدي رمز العميل:

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

ويمكنك أيضا استخدام BigInteger للبايت طول متغير. يمكنك تحويله إلى طويل، صحيح أو قصيرة، أيهما يناسب احتياجاتك.

new BigInteger(bytes).intValue();

وأو للدلالة على قطبية:

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

واستكمال كود تحويل جافا لجميع أنواع بدائية إلى / من صفائف http://www.daniweb.com/code/snippet216874.html

ويتم التعامل مع كل خلية في مجموعة كما غير موقعة الباحث:

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;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top