質問

アプリケーションに読み取り、.NETデータ型に保存する必要がある10バイトシリアル番号を備えたデバイスがあります。デバイスでは、署名されていない10バイト(80ビット)番号として保存されます。この数値で数学的な操作を実行することは期待していませんが、ユーザーにのみ表示するだけです。

.NETフレームワーク 組み込みのUnit128はありません このデータタイプを保存します。このデータタイプを保存するための私の提案は、10要素バイト配列を作成し、この配列にデータを読み取ることです。この問題に対するより良い解決策はありますか?

注:私は見たことがあります この質問 GUIDは128バイトの署名された整数ですが、この方法でGUIDを使用することは悪い考えのようです。他に提案はありますか?

役に立ちましたか?

解決

バイト配列を使用する必要があります。

他のヒント

表示しているだけの場合、文字列を使用してみませんか?偶発的な変更に対する追加のセキュリティが必要な場合は、それをいくつかのビジネスオブジェクトに包むこともできます。

@slaksに同意します。バイト配列を使用する必要があります。しかし、biginteger、 http://msdn.microsoft.com/en-us/library/system.numerics.biginteger.aspx, また、理論的には下/上限がないため、機能する可能性があります。これは.NET 4のみです。ただし、バイト配列はまだより良い選択です。

数の計算を行っていない場合、System.Stringの何が問題なのですか?

選択肢はほとんどありません。データの使用方法に依存します。それをGUIDにパックしたり、バイト配列を使用したり、カスタム構造体を使用したり、base64またはhexとしてパックしたり、文字列に詰めたりできます。

[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);
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top