正如您已经提到的,您将使用uint[]
for 加密。
由于某些原因,您使用BlockCopy
. 但是您想像访问byte[]
一样访问uint[]
,而不转换或转换整个数组。
那么,有什么不足呢?C#中有什么东西可以做到这一点吗?
再想一小时后,我猜你想要它的目的,应该是indexer
.
这是代码。这很简单。
public partial class UIntIndexer {
static int ComputeElementCount(int size, int bytesCount) {
var r=~0;
return Math.DivRem(bytesCount, size, out r)+(r>0?1:0);
}
static int ComputeIndex(int index) {
return sizeof(uint)*index;
}
public UIntIndexer(byte[] array) {
m_Length=ComputeElementCount(sizeof(uint), (m_Array=array).Length);
}
public uint this[int index] {
set {
var startIndex=ComputeIndex(index);
var bytes=BitConverter.GetBytes(value);
var count=m_Length>1+index?sizeof(uint):m_Array.Length-startIndex;
Buffer.BlockCopy(bytes, 0, m_Array, startIndex, count);
}
get {
var startIndex=ComputeIndex(index);
if(m_Length>1+index)
return BitConverter.ToUInt32(m_Array, startIndex);
else {
var bytes=new byte[sizeof(uint)];
Buffer.BlockCopy(m_Array, startIndex, bytes, 0, m_Array.Length-startIndex);
return BitConverter.ToUInt32(bytes, 0);
}
}
}
public int Length {
get {
return m_Length;
}
}
byte[] m_Array;
int m_Length;
}
如果应该考虑线程安全,您可能需要保持源数组同步。以下是测试它的代码:
var alldata=new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
var block32=new byte[alldata.Length];
var uintIndexer=new UIntIndexer(block32);
Buffer.BlockCopy(alldata, 0, block32, 0, alldata.Length);
Debug.Print("uintIndexer.Length={0}", uintIndexer.Length);
for(var i=uintIndexer.Length; i-->0; )
Debug.Print("uintIndexer[{0}]={1}", i, uintIndexer[i]);