gpt4 book ai didi

c# - 在 C# 中是否有对字节数组进行循环位移的函数?

转载 作者:行者123 更新时间:2023-11-30 12:11:24 26 4
gpt4 key购买 nike

我似乎无法找到是否有内置的方法来对字节数组进行循环位移,C 的 ROL and 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

最佳答案

这并不像您想的那么简单。这是此线程关闭之前的快速版本:

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);

关于c# - 在 C# 中是否有对字节数组进行循环位移的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15561607/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com