مشكلة C# باستخدام السمكة المنتفخة NET:كيفية التحويل من Uint32[] إلى بايت[]

StackOverflow https://stackoverflow.com/questions/692810

  •  22-08-2019
  •  | 
  •  

سؤال

في لغة 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).

وبالطبع يجب عليك فقط استخدام هذا إذا كان الأداء هو قضية (تجنب الأمثل من السابق لأوانه).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top