2010-10-19 1 views
0

Итак, у меня есть массив байтов длиной 16, каждый из которых содержит 8 бит, представляющих мои данные, и массив длиной 8 бит с каждыми 4 битами (так 2 байта), представляющими мои данные.Разделение 8-битного байта

Если бы я захотел зациклиться на них и получить значения, что было бы самым простым способом сделать это?

Моя неудачная попытка была бы такой, но это, похоже, не работает, как я ожидаю.

for(int i = 0; i < bigByteArray.Length; i++) 
{ 
    byte BigByteInfo = bigByteArray[i]; 
    byte SmallByteInfo; 
    if(i % 2 == 0) 
    { 
     SmallByteInfo = smallByteArray[i/2] % 16; 
    } 
    else 
    { 
     SmallByteInfo = smallByteArray[i/2]/16; 
    } 

    //Use of data Here. 
} 
+0

, как это делает не казаться, что он работает? Это действительно хорошо выглядит – Toad

+0

Что вы ожидаете, и что происходит? – raven

+0

Возможно, я что-то испортил. Хм. – Blam

ответ

1

вы можете использовать этот класс как вспомогательный класс

public class FoutBitsArrayEnumerator : IEnumeable<byte> 
{ 
    FoutBitsArrayEnumerator(byte[] array) 
    { 
    this.array = array; 
    } 
    public IEnumerator<byte> GetEnumerator 
    { 
    foreach (byte i in array) 
    { 
     yield return i & 15; 
     yield return (i >> 4) & 15; 
    } 
    } 

    byte[] array; 
} 
+0

Не скомпилируется по той же причине, что и ОП; вам не хватает преобразования в байт. У вас также есть несколько опечаток (IEnumeable, отсутствующие круглые скобки метода и т. Д.). –

+0

Что я имел в виду, это дать ему направление, а не компилируемое решение. –

+0

Я действительно реализовал такое решение, как сейчас, это намного чище, чтобы читать, спасибо. К сожалению, моя проблема не заключалась в неправильном считывании данных, это был мой идиотизм при проверке правильности данных: P – Blam

1

Если я понимаю, право (bigByteArray 16 длинный, smallByteArray 8 длинный, упакованный):

for(int i = 0; i < bigByteArray.Length; i++) 
{ 
    bigByteArray[i] = (byte)((smallByteArray[i/2] >> (i % 2 == 0 ? 4 : 0)) & 0xF); 
} 
+0

ваш onelinre не делает ничего, что отличается от его фрагмента кода, который также выглядит на первый взгляд хорошим. Похоже, его ожидание того, что должно произойти, отличается от фактического вывода – Toad

+0

@Toad, они похожи. Однако он не будет компилироваться по крайней мере по одной причине (отсутствует преобразование в байт). Вышеприведенное тестирование. –

+0

Надеюсь, это проблема, с которой он сталкивается! (p.s. вы считали использование (i & 1) вместо (i% 2) для удобочитаемости и, возможно, даже скорости (на встроенных системах))? – Toad

Смежные вопросы