مشكلة C# باستخدام السمكة المنتفخة NET:كيفية التحويل من Uint32[] إلى بايت[]
سؤال
في لغة C#، أستخدم ملف Blowfish.NET 2.1.3 الخاص بـ BlowfishECB.cs (يمكن العثور عليها هنا)
في لغة C++، هذا غير معروف، ولكنه مشابه.
في لغة C++، يكون إجراء التهيئة (السمكة المنتفخة) كما يلي:
void cBlowFish::Initialize(BYTE key[], int keybytes)
في C#، إجراء التهيئة (السمكة المنتفخة) هو نفسه
public void Initialize(byte[] key, int ofs, int len)
هذه هي المشكلة:
هذه هي الطريقة التي تتم بها تهيئة المفتاح في C++
DWORD keyArray[2] = {0}; //declaration
...some code
blowfish.Initialize((LPBYTE)keyArray, 8);
كما ترى، المفتاح عبارة عن مصفوفة مكونة من كلمتين، يبلغ إجماليهما 8 بايت.
في C# أعلن ذلك بهذه الطريقة، ولكن أحصل على خطأ
BlowfishECB blowfish = new BlowfishECB();
UInt32[] keyarray = new UInt32[2];
..some code
blowfish.Initialize(keyarray, 0, 8);
الخطأ هو:
الوسيطة "1":لا يمكن التحويل من 'uint[]' إلى 'byte[]'
ما الخطأ الذي افعله؟
شكرا لك مقدما!
المحلول
ويمكنك استخدام BitConverter للحصول على وحدات البايت من UInt32.
لذلك، ستحتاج إلى تحويل كل عنصر في حلقة. وأود أن تفعل شيئا مثل:
و
private byte[] ConvertFromUInt32Array(UInt32[] array)
{
List<byte> results = new List<byte>();
foreach(UInt32 value in array)
{
byte[] converted = BitConverter.GetBytes(value);
results.AddRange(converted);
}
return results.ToArray();
}
لنذهب مرة أخرى:
و
private UInt32[] ConvertFromByteArray(byte[] array)
{
List<UInt32> results = new List<UInt32>();
for(int i=0;i<array.Length;i += 4)
{
byte[] temp = new byte[4];
for (int j=0;j<4;++j)
temp[j] = array[i+j];
results.Add(BitConverter.ToUInt32(temp);
}
return results.ToArray();
}
نصائح أخرى
إذا كنت تستخدم VS2008 أو C# 3.5، فجرّب حل LINQ + BitConverter التالي
var converted =
keyArray
.Select(x => BitConverter.GetBytes(x))
.SelectMany(x => x)
.ToArray();
كسر هذا
- يقوم التحديد بتحويل كل UInt32 إلى بايت[].والنتيجة هي IEnumerable<byte[]>
- تقوم مكالمات SelectMany بتسوية IEnumerable<byte[]> إلى IEnumerable<byte>
- يقوم ToArray() ببساطة بتحويل العدد القابل للتعداد إلى مصفوفة
يحرر حل غير LINQ يعمل أيضًا
List<byte> list = new List<byte>();
foreach ( UInt32 k in keyArray) {
list.AddRange(BitConverter.GetBytes(k));
}
return list.ToArray();
إذا كنت في حاجة الى <قوية> طريقة أسرع لتحويل أنواع القيمة الخاصة بك، يمكنك استخدام المأجور وصفتها في الجواب التالي: <لأ href = "https://stackoverflow.com/questions/619041 / و-أسرع في اتجاه لتحويل ما هو بين واحد في المتاحة للتداول الإلكتروني إلى بايت / 619307 # 619307 "> ما هي اسرع وسيلة لتحويل تعويم [] إلى [] بايت؟ أ >
وهذا الإختراق تجنب تخصيص الذاكرة والتكرار. فهو يوفر لك وجهة نظر مختلفة من مجموعة الخاصة بك في O (1).
وبالطبع يجب عليك فقط استخدام هذا إذا كان الأداء هو قضية (تجنب الأمثل من السابق لأوانه).