Frage

kann ich sagen, ich weiß nicht, was ich um Hilfe bin gefragt, weil ich das Format nicht wissen, aber ich habe ein Bild bekommt.

Ich habe ein byte [] Array, wie kann ich es unten in dieses Format zu konvertieren (in rechts)?

alt text http://img512.imageshack.us/img512/3548/48667724 .jpg

Es ist nicht reine ASCII.

War es hilfreich?

Lösung

b.ToString("x2") Verwenden Sie ein Byte-Wert in eine zweistellige hexadezimale Zeichenfolge zu formatieren.

Für die ASCII-Anzeige, prüfen Sie, ob der Wert zu einem regulären druckbare Zeichen entspricht und wandelt es, wenn er:

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

oder kürzer:

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

Um es auf einem Array zu tun:

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

Andere Tipps

Es klingt wie Sie ein Array von Bytes nehmen möchten, und wandeln sie in Text

(Zeichen außerhalb eines bestimmten Bereichs mit „.“ s ersetzt)
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();
}

oder als LINQy Erweiterungsmethode (in einer statischen Verlängerungs Klasse):

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

(Könnte man so wie string printable = byteArray.ToPrintableString(); nennen)

Dies könnte eine beliebige Anzahl von Codierungen sein ... versuchen, diesen Test Testskript, um zu sehen, welche von ihnen ausdrucken:

Bl8s

Hier ist das Skript:

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

[Bearbeiten 2018:] Re-schrieb die Funktion von Grund auf den Code viel effizienter und beheben einige andere Probleme zu machen. Sie können nun optional auch einen Start angeben Offset und Anzahl der Bytes (von dort ausgehend) angezeigt werden soll.


Wenn Sie die gesamte Speicheranzeige wollen, einschließlich der Korrekturnummer, und links und rechts angezeigt wird, können Sie es wie dies tun können: (32-Byte Breite)

/// <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();
}

Der Code verwendet die folgenden Helfer, welche Zeichen zu bestimmen, sollte als ‚Punkte‘ in rechten Teil gezeigt werden.

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

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

Ausgabe der obigen Funktion sieht wie folgt aus (Zeichenbreite 138 Spalten ist, scrollen Sie nach rechts die „Menschen lesbare“ -Teil zu sehen):

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

Versuchen: Encoding.Default.GetBytes

Wenn das nicht funktioniert, gibt es verschiedene Arten, die Sie angeben können (UTF-8, ASCII ...)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top