4

我似乎无法找到是否有一种内置方法可以对字节数组进行循环位移,C 的ROL 和 ROR过去对单个字节做了什么?

让我解释一下,比如说,我有一个数组(二进制):

[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
4

1 回答 1

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);
于 2013-03-22T03:04:55.467 回答