2016-10-27 7 views
2

.NET의 System.DirectoryServices.Protocols 어셈블리는 가벼운 ASN.1 BER 인코더를 지정하지만 설명서는 좋지 않습니다 (BerConverter).C# BerConverter.Encode()를 사용하여 응용 프로그램 또는 컨텍스트 관련 태그를 지정할 수 있습니까?

형식 문자열과 인코딩 할 개체 목록을 지정하여 호출합니다.

  • INTEGER의이 형식의 문자로 인코딩 될 수 i 또는 e
  • OCTET STRING S 등
  • SEQUENCE{ 인코딩 될 수 o 문자 }
  • 인코딩 될 수

저는이 간단한 변환을 사용하고 싶습니다. 그래서 나는 추가 의존성을 가질 필요가 없다. 종속성을 얻는 것은 바람직하지 않습니다. C#은 Powershell에서 호출 할 수 있기 때문이며 .NET에 포함되지 않은 어셈블리가 필요하지 않는 한 C#으로 멋진 스크립트를 배포하는 것은 좋습니다.

그러나 BerConverter는 ASN.1에서 모호성을 제거하는 데 자주 사용되는 응용 프로그램 또는 컨텍스트 관련 태그를 지정하는 방법이없는 것처럼 보입니다. 예를 들어 구성된 유형의 구성 요소가 OPTIONAL

그래서, 인코딩 할 수있는 사항은 다음과 같습니다

BerConverter.Encode("{i{i}}", 1, 2);

주는 :

30 84 00 00 00 0c 02 01 01 30 84 00 00 00 03 02 01 02

그러나 두 번째 시퀀스가 ​​[Application 1] 또는 61 일 필요가있는 경우 ... 인코딩에서 해당 형식의 문자열을 내보내려면 무엇을 넣어야할지 모르겠습니다.

BerConverter에도이 기능이 있습니까?

+1

당신 디 컴파일러 (예 : ILSpy)를 사용하고 BerConverter 코드를보고 무슨 일이 일어나는지 볼 수 있습니다. –

+0

@bosonix 의견을 주셔서 감사합니다. 나는 디 컴파일을 생각하지 않은 이유를 모른다. 저는 JetBrains dotPeek를 사용하여'BerConverter.Encode()'를 역 컴파일했고, 커버 아래에서'ber_printf()'를 호출하고 있다는 것을 알았습니다. 더 나은 문서화가 있습니다. 아래 답변을 참조하십시오. – petrsnd

답변

1

내가 왜 이렇게하지 않았는지 모르겠지만 코드를 살펴보기 위해 디 컴파일러를 사용했습니다. 나는 BerConverter.Encode()ber_printf()을 기반으로한다는 것을 알았습니다. 워드 프로세서

:

문자 : 't'

설명 :

태그. 다음 인수는 ber_tag_t이며, BerElement에 쓰여진 다음 요소를 무시할 태그를 지정합니다. 이것은 전화를 통해 작동합니다.

그래서, 난 내 코드를 변경 할 수 있었다 : 나를 0x61에 태그 값을 설정하고 코드를 방출 할 수 있습니다

BerConverter.Encode("{it{i}}", 1, 0x61, 2)

:

30 84 00 00 00 0c 02 01 01 61 84 00 00 00 03 02 01 02