كيفية تحويل صفيف بايت إلى قيمة رقمية لها (جافا)؟
سؤال
ولدي مجموعة 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
في التعليقات.
وعلى الرغم من أنها قد لا تكون قابلة للتطبيق في هذه الحالة، جمال Buffer
s تأتي مع النظر في صفيف مع قيم متعددة.
وعلى سبيل المثال، إذا كان لدينا مجموعة 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;
}