سؤال

أستطيع أن أقول أنا لا أعرف ما أنا أطلب المساعدة لأنني لا أعرف شكل,ولكن حصلت على صورة.

لدي byte[] مجموعة ,كيف يمكنني تحويله إلى هذا الشكل أدناه(في الحق)?

النص البديل http://img512.imageshack.us/img512/3548/48667724.jpg

لا عادي ascii.

هل كانت مفيدة؟

المحلول

استخدم b.ToString("x2") لتهيئة قيمة البايت إلى سلسلة الست عشرية حرف اثنين.

لعرض ASCII، معرفة ما اذا كان يتوافق مع القيمة إلى حرف للطباعة العادية وتحويلها إذا هو:

if (b >= 32 && b <= 127) {
   c = (char)b;
} else {
   c = '.';
}

وأو أقصر:

c = b >= 32 && b <= 127 ? (char)b : '.';

لتفعل ذلك على صفيف:

StringBuilder builder = new StringBuilder();
foreach (b in theArray) {
   builder.Append(b >= 32 && b <= 127 ? (char)b : '.');
}
string result = builder.ToString();

نصائح أخرى

هذا يبدو وكأنه كنت ترغب في اتخاذ صفيف من البايت ، وتحويله إلى نص (استبدال الشخصيات خارج نطاق معين مع "."s)

static public string ConvertFromBytes(byte[] input)
{
    StringBuilder output = new StringBuilder(input.Length);

    foreach (byte b in input)
    {
        // Printable chars are from 0x20 (space) to 0x7E (~)
        if (b >= 0x20 && b <= 0x7E)
        {
            output.Append((char)b);
        }
        else
        {
            // This isn't a text char, so use a placehold char instead
            output.Append(".");
        }
    }

    return output.ToString();
}

أو LINQy طريقة التمديد (داخل ثابت امتداد الدرجة):

static public string ToPrintableString(this byte[] bytes)
{
    return Encoding.ASCII.GetString
           (
              bytes.Select(x => x < 0x20 || x > 0x7E ? (byte)'.' : x)
                   .ToArray()
           );
}

(هل يمكن أن نسمي ذلك مثل string printable = byteArray.ToPrintableString();)

وهذا يمكن أن يكون أي عدد من ترميزات ... حاول هذا السيناريو اختبار اختبار لمعرفة أي منها طباعة:

Bl8s

وهنا هو السيناريو:

byte[] b = new byte[] {0x42, 0x6C, 0x38, 0x73 };
foreach (EncodingInfo ei in Encoding.GetEncodings())
{
     Console.WriteLine("{0} - {1}", ei.GetEncoding().GetString(b), ei.Name);
}

[تحرير 2018:] إعادة كتابة وظيفة من الصفر لجعل رمز أكثر كفاءة و إصلاح بعض المشاكل الأخرى.يمكنك الآن أيضا اختياريا تحديد بدء ويقابل عدد وحدات البايت (بدءا من هناك) على الشاشة.


إذا كنت تريد كل شاشة الذاكرة ، بما في ذلك عدد تعويض و اليمين و اليسار يعرض, يمكنك أن تفعل ذلك من هذا القبيل:(32-بايت العرض)

/// <summary> Returns a String where the specified bytes are formatted in a
/// 3-section debugger-style aligned memory display, 32-bytes per line </summary>
public static unsafe String MemoryDisplay(byte[] mem, int i_start = 0, int c = -1)
{
    if (mem == null)
        throw new ArgumentNullException();
    if (i_start < 0)
        throw new IndexOutOfRangeException();
    if (c == -1)
        c = mem.Length - i_start;
    else if (c < 0)
        throw new ArgumentException();
    if (c == 0)
        return String.Empty;

    char* pch = stackalloc Char[32];       // for building right side at the same time
    var sb = new StringBuilder((c / 32 + 1) * 140);            // exact pre-allocation

    c += i_start;
    for (int i = i_start & ~0x1F; i < c;)
    {
        sb.Append(i.ToString("x8"));
        sb.Append(' ');

        do
        {
            if (i < i_start || i >= c)          // non-requested area, or past the end
            {
                sb.Append("   ");   
                pch[i & 0x1F] = ' ';
            }
            else
            {
                var b = mem[i];
                sb.Append(b.ToString("x2") + " ");
                pch[i & 0x1F] = non_monospace(b) ? '.' : (Char)b;
            }
        }
        while ((++i & 0x1F) != 0);

        sb.Append(' ');
        sb.AppendLine(new String(pch, 0, 32));
    }
    return sb.ToString();
}

تستخدم التعليمة البرمجية التالية المساعدين لتحديد الأحرف التي يجب أن تكون على النحو المبين 'النقاط' في الجزء الايمن.

static readonly ulong[] _nmb =
{
    0x00000000ffffe7ffUL,
    0x8000000000000000UL,
    0x00002000ffffffffUL,
    0x0000000000000000UL,
};

static bool non_monospace(byte b) => (_nmb[b >> 6] & 1UL << b) != 0;

إخراج الدالة أعلاه يبدو مثل هذا (حرف عرض 138 الأعمدة ، انتقل إلى اليمين لرؤية "الإنسان للقراءة" الجزء الأول):

00000000 47 49 46 38 39 61 0f 00 0f 00 91 ff 00 00 00 00 c0 c0 c0 ff ff 00 00 00 00 21 f9 04 01 00 00 01 GIF89a...................!......
00000020 00 2c 00 00 00 00 0f 00 0f 00 00 02 2c 8c 0d 99 c7 91 02 e1 62 20 5a 79 ea bd 00 6d 89 69 8a f8 .,..........,.......b Zy...m.i..
00000040 08 e5 a7 99 e9 17 9d ac 24 a2 21 68 89 1e ac b4 d9 db 51 ab da c8 8c 1a 05 00 3b                ........$.!h......Q.......;

وجرب: Encoding.Default.GetBytes

إذا لم يفلح ذلك، وهناك أنواع مختلفة يمكنك تحديد (UTF-8، ASCII ...)

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