Pregunta

Tenemos un dispositivo que tiene un número de serie de 10 bytes que debe leerse en nuestra aplicación y almacenarse en un tipo de datos .NET. En el dispositivo se almacena como un número de 10 bytes sin firmar (80 bits). No espero que realicemos operaciones matemáticas en este número, sino que solo lo muestren al usuario.

El marco .net no tiene una unidad incorporada128 Para almacenar este tipo de datos. Mi sugerencia para almacenar este tipo de datos es crear una matriz de bytes de 10 elementos y leer en los datos en esta matriz. ¿Hay mejores soluciones para este problema?

Nota: He visto en esta pregunta Que un GUID es un entero firmado de 128 bytes, pero parece una mala idea usar un GUID de esta manera. ¿Cualquier otra sugerencia?

¿Fue útil?

Solución

Debe usar una matriz de bytes.

Otros consejos

Si solo lo está mostrando, ¿por qué no usar una cadena? Si desea seguridad adicional contra cambios accidentales, incluso podría envolverlo en algún objeto comercial.

Estoy de acuerdo con @Slaks, debe usar una matriz de bytes. Sin embargo, Biginteger, http://msdn.microsoft.com/en-us/library/system.numerics.biginteger.aspx, también podría funcionar, ya que teóricamente no tiene límites inferiores/superiores. Esto es solo para .NET 4. Sin embargo, la matriz de bytes aún sería una mejor opción.

Si no está haciendo cálculos sobre el número, ¿qué pasa con System.String?

Tienes pocas opciones. Cualquiera que dependan de cómo usará los datos. Puede empacarlo en un GUID, usar una matriz de bytes, usar una estructura personalizada o empacarlo como base64 o hex y meterlo en una cadena.

[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);
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top