2010-06-03 3 views
0

우리는 우리의 응용 프로그램으로 읽어 와서 .net 데이터 유형으로 저장해야하는 10 바이트 일련 번호가있는 장치를 가지고 있습니다. 장치에서는 부호없는 10 바이트 (80 비트) 번호로 저장됩니다. 이 숫자에 대해 수학적 연산을 수행하지는 않지만 사용자에게만 표시 할 것입니다.긴 일련 번호 (10 바이트)를 저장하는 데이터 유형

이 데이터 형식을 저장하는 .NET Framework doesn't have a built in UNIT128. 이 데이터 형식을 저장하기위한 제안은 10 바이트 바이트 배열을 만들고이 배열에 데이터를 읽는 것입니다. 이 문제에 대한 더 나은 해결책이 있습니까?

참고 : this question에서 GUID는 128 바이트 부호있는 정수이지만 GUID를이 방식으로 사용하는 것은 좋지 않은 것처럼 보입니다. 다른 제안?

+0

바이들은 완전히 임의입니까? – SLaks

+0

@SLaks, 네 바이트가 임의적이라고 생각합니다 (일련 번호 디자이너에게 확인해야하며 누구인지는 알 수 없습니다) – CrimsonX

+0

원시 바이트를 16 진수로 표시하고 있습니까? ? – SLaks

답변

4

바이트 배열을 사용해야합니다.

+0

내가 같은 페이지에 있다는 소식을 듣고 이것이 가장 간단한 옵션이라고 생각합니다. 두 번째 의견을 주셔서 감사합니다. – CrimsonX

0

숫자에 대한 계산을 수행하지 않는 경우 System.String의 잘못된 점은 무엇입니까?

1

문자열 만 표시하는 이유는 무엇입니까? 우발적 인 변경에 대비하여 추가 보안을 원한다면이를 일부 비즈니스 객체로 감쌀 수도 있습니다.

+1

그러면 인코딩 문제가 발생합니다. – SLaks

+0

@SLacks : 인코딩 문제는 무엇입니까? 내가 뭔가를 놓칠 수 있습니다,하지만 경우에만 사용자에게 표시하는 데 사용되는 어떻게 인코딩 문제입니다. DB에서 가져 오기조차도 (상대적으로) 간단한 Cast() 또는 Convert() 호출입니다. – AllenG

0

몇 가지 옵션이 있습니다. 어떤 방법이든 데이터 사용 방법에 따라 다릅니다. Guid에 팩을 넣거나, 바이트 배열을 사용하거나, 사용자 정의 Struct을 사용하거나, 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); 
    } 
} 
+0

'struct'의 유일한 점은 올바르게 마샬링하는 것입니다. – SLaks

+0

그 이유는 데이터의 이유에 따라 다릅니다. 입력 데이터를 디코딩 할 수있는 경우 C 공용체와 같은 구조체를 사용할 때 아무런 문제가 없습니다. 데이터가 VIN 코드처럼 디코딩 될 수 있다고 가정 해보십시오. 당신은'struct' 바이트 패킹을 사용하여 관련된 부분에 열거 형과 플래그를 오버레이 할 수 있습니다. –

+0

장치의 10 바이트 데이터가 실제로 ASCII로 인코딩 된 일련 번호 일 가능성도 매우 높습니다. 그리고 그렇다면'Encoding.ASCII.GetString (...) '을 사용하는 데는 아무런 문제가 없습니다. –

1

@SLaks에 동의합니다. 바이트 배열을 사용해야합니다. 그러나 이론적으로 하위/상한이 없기 때문에 BigInteger, http://msdn.microsoft.com/en-us/library/system.numerics.biginteger.aspx도 작동 할 수 있습니다. .NET 4 전용입니다. 바이트 배열은 여전히 ​​더 나은 선택이 될 것이다.

+0

이 데이터 유형을 아는 것이 좋습니다. 정보를 주셔서 감사합니다 – CrimsonX

+0

이것은 닷넷 4에서만 사용 가능합니다. – SLaks

+0

@SLaks - 좋은 지적입니다. –