Frage

Wir haben ein Gerät mit einer 10 -Byte -Seriennummer, die in unsere Anwendung gelesen und in einen .NET -Datentyp gespeichert werden muss. In dem Gerät wird es als nicht signierte 10-Bit-Nummer (80-Bit) gespeichert. Ich erwarte nicht, dass wir mathematische Operationen auf dieser Nummer ausführen werden, aber nur dem Benutzer anzeigen werden.

Das .NET -Framework hat keine eingebaute Einheit in Einheit128 So speichern Sie diesen Datentyp. Mein Vorschlag zum Speichern dieses Datentyps ist, ein 10 -Element -Byte -Array zu erstellen und in den Daten in dieses Array zu lesen. Gibt es bessere Lösungen für dieses Problem?

Hinweis: Ich habe in gesehen diese Frage Dass eine GUID ein 128 -Byte -Ganzzahl ist, aber es scheint eine schlechte Idee zu sein, auf diese Weise einen GUID zu verwenden. Irgendwelche anderen Vorschläge?

War es hilfreich?

Lösung

Sie sollten ein Byte -Array verwenden.

Andere Tipps

Wenn Sie es nur anzeigen, warum nicht eine Zeichenfolge verwenden? Wenn Sie zusätzliche Sicherheit gegen zufällige Änderungen wünschen, können Sie dies sogar in ein Geschäftsobjekt einwickeln.

Ich stimme @Slaks zu, Sie sollten ein Byte -Array verwenden. Allerdings Biginteger, http://msdn.microsoft.com/en-us/library/system.numerics.bigintier.aspx, könnte auch funktionieren, da es theoretisch keine unteren/oberen Grenzen hat. Dies ist nur für .NET 4. Byte Array wäre jedoch immer noch eine bessere Wahl.

Wenn Sie keine Berechnungen für die Zahl durchführen, was falsch mit System.String?

Sie haben nur wenige Optionen. Sie hängen davon ab, wie Sie die Daten verwenden. Sie können es in eine GUID packen, ein Byte -Array verwenden, eine benutzerdefinierte Struktur verwenden oder als Basis64 oder Hex packen und es in eine Zeichenfolge stopfen.

[StructLayout( LayoutKind.Explicit)]
public struct MyStruct
{
    public MyStruct(byte[] buffer)
    {
        if (buffer.Length != 10)
            throw new ArgumentOutOfRangeException();
        High = BitConverter.ToUInt16(buffer, 0);
        Low = BitConverter.ToUInt64(buffer, 2);
    }
    [FieldOffset(0)]
    public ushort High;  //2 bytes
    [FieldOffset(2)]
    public ulong Low;    //8 bytes

    public byte[] Bytes
    {
        get
        {
            return BitConverter.GetBytes(High)
                .Concat(BitConverter.GetBytes(Low))
                .ToArray();
        }
    }
    public override string ToString()
    {
        return Convert.ToBase64String(Bytes);
    }
    public static MyStruct Parse(string toParse)
    {
        var bytes = Convert.FromBase64String(toParse);
        return new MyStruct(bytes);
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top