سؤال

أنا أعمل مع جافا.

لدي صفيف بايت (8 بت في كل موقف من الصفيف) وما أحتاج إلى القيام به هو وضع 2 من قيم الصفيف والحصول على قيمة.

سأحاول شرح نفسي أفضل؛ أنا استخراج البيانات الصوتية من ملف صوتي. يتم تخزين هذه البيانات في صفيف بايت. تحتوي كل عينة صوتية على حجم 16 بت. إذا كانت الصفيف هو:

البايت [] Audiodata؛

ما أحتاج إليه هو الحصول على قيمة واحدة من عينات Audiodata [0] و Audiodata [1] من أجل الحصول على 1 عينة صوتيات.

هل يمكن لأي شخص أن يفسرني كيف أفعل هذا؟

شكرا مقدما.

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

المحلول

أنا لست مطورا جافا بحيث يمكن أن يكون هذا خارج قاعدة تماما، ولكن هل فكرت في استخدام bytebuffer.?

نصائح أخرى

افترض أن LSB في البيانات [0

int val;

val = (((int)data[0]) & 0x00FF) | ((int)data[1]<<8);

كما هو مقترح من قبل، فإن جافا لديها فصول لمساعدتك في ذلك. يمكنك التفاف مجموعة الخاص بك مع bytebuffer. ثم الحصول على intbuffer. عرضها.

ByteBuffer bb = ByteBuffer.wrap(audioData);
// optional: bb.order(ByteOrder.BIG_ENDIAN) or bb.order(ByteOrder.LITTLE_ENDIAN)
IntBuffer ib = bb.asIntBuffer();
int firstInt = ib.get(0);
ByteInputStream b = new ByteInputStream(audioData);
DataInputStream data = new DataInputStream(b);
short value = data.readShort();

تتمثل ميزة الكود أعلاه في أنه يمكنك الاستمرار في قراءة بقية "البيانات" بنفس الطريقة.

قد يكون الحل الأكثر بساطة لقيمتين فقط:

short value = (short) ((audioData[0]<<8) | (audioData[1] & 0xff));

يستخرج هذا الحل البسيط بايتين، وقطعهم مع البايت الأول من البايت العالي والبايت البايت البايت السفلي (هذا يعرف باسم الإند الداخلي؛ إذا كانت صفيف البايت الخاصة بك تحتوي على بيانات صغيرة، فستتحول البايت الثاني بدلا من ذلك لأرقام 16 بت؛ للأرقام الصغيرة 32 بت قليلا، سيتعين عليك عكس ترتيب جميع البايتات الأربعة، لأن أعداد صحيحة جافا تتبع الطلب الننيفي الكبير).

طريقة أسهل في جافا لتحليل مجموعة من البايتات إلى البتات jbbp الاستعمال

  class Parsed { @Bin(type = BinType.BIT_ARRAY) byte [] bits;}
  final Parsed parsed = JBBPParser.prepare("bit:1 [_] bits;").parse(theByteArray).mapTo(Parsed.class);

سيقوم الرمز بوضع أجزاء تحليل من كل بايت ك 8 بايت في صفيف البتات من مثيل الطبقة المحيطة

يمكنك تحويل إلى short (2 بايت) عن طريق المنطقي أو جي البايتين معا:

short value = ((short) audioData[0]) | ((short) audioData[1] << 8);

أقترح عليك إلقاء نظرة على بائع. وبعد في Preon، ستكون قادرا على قول شيء مثل هذا:

class Sample {

  @BoundNumber(size="16") // Size of the sample in bits
  int value;

}

class AudioFile {

  @BoundList(size="...") // Number of samples
  Sample[] samples;

}

byte[] buffer = ...;
Codec<AudioFile> codec = Codecs.create(AudioFile.class);
AudioFile audioFile = codec.decode(buffer);
byte myByte = 0x5B;

boolean bits = new boolean[8];

for(int i = 0 ; i < 8 ; i++)
    bit[i] = (myByte%2 == 1);

النتائج هي مجموعة من الأصفار والأخرى 1=TRUE و 0=FALSE :)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top