2013-03-22 2 views
4

Кажется, я не могу найти, есть ли встроенный способ выполнения циклического битового байта массива байтов, что C ROL and ROR имел обыкновение делать с одним байтом?Есть ли функция для циклического битового сдвига для массива байтов в C#?

Позвольте мне объяснить, скажем, у меня есть массив (в двоичном коде):

[0] = 11001110 
[1] = 01000100 
[2] = 10100001 

, а затем, если я хочу сделать ROL_Array(1 bit) или перемещать биты 1 бит влево, я получаю:

[0] = 10011100 
[1] = 10001001 
[2] = 01000011 

или, если я хочу сделать ROR_Array(2 bits) или перемещать биты 2 бита вправо, я получаю:

[0] = 00110011 
[1] = 01010001 
[2] = 10101000 
+2

http://stackoverflow.com/questions/35167/is-there-a-way-to- execute-a-circle-bit-shift-in-c – devshorts

+1

@devshorts: Это байт, а не байтовый массив. – ahmd0

+0

Думаю, вам придется написать это самостоятельно, учитывая, что вы должны сделать это для себя за один байт, не говоря уже о массиве байтов – devshorts

ответ

3

Это не так просто, как вы думаете. Вот быстрая версия, прежде чем этот поток закрывается:

public static byte[] ROL_ByteArray(byte[] arr, int nShift) 
{ 
    //Performs bitwise circular shift of 'arr' by 'nShift' bits to the left 
    //RETURN: 
    //  = Result 
    byte[] resArr = new byte[arr.Length]; 

    if(arr.Length > 0) 
    { 
     int nByteShift = nShift/(sizeof(byte) * 8); //Adjusted after @dasblinkenlight's correction 
     int nBitShift = nShift % (sizeof(byte) * 8); 

     if (nByteShift >= arr.Length) 
      nByteShift %= arr.Length; 

     int s = arr.Length - 1; 
     int d = s - nByteShift; 

     for (int nCnt = 0; nCnt < arr.Length; nCnt++, d--, s--) 
     { 
      while (d < 0) 
       d += arr.Length; 
      while (s < 0) 
       s += arr.Length; 

      byte byteS = arr[s]; 

      resArr[d] |= (byte)(byteS << nBitShift); 
      resArr[d > 0 ? d - 1 : resArr.Length - 1] |= (byte)(byteS >> (sizeof(byte) * 8 - nBitShift)); 


     } 
    } 

    return resArr; 
} 

и вот тест:

byte[] arr = new byte[] { 
    Convert.ToByte("11001110", 2), 
    Convert.ToByte("01000100", 2), 
    Convert.ToByte("10100001", 2), 
    }; 

byte[] arr2 = Auth.ROL_ByteArray(arr, 1); 

string sss = ""; 
for (int i = 0; i < arr2.Length; i++) 
    sss += Convert.ToString(arr2[i], 2) + ", "; 

Debug.WriteLine(sss); 
+0

Какова цель умножения 8 на ' sizeof (byte) ', учитывая, что .NET указывает диапазон значений 0..255? – dasblinkenlight

+0

@dasblinkenlight: Это просто мой способ вычисления количества бит в байте. Вы можете жестко указать это значение, если хотите. – ahmd0

+0

Как ваше жесткое кодирование 8 отличается от чьего-то жесткого кодирования 8? Вы сами используете 8 везде, кроме смены; причина, по которой он работает, заключается в том, что 'sizeof (byte)' гарантирован * * является '1', поэтому зачем беспокоиться о приведении в действие, которая требует небезопасного контекста? – dasblinkenlight

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