Help us understand the problem. What is going on with this article?

SnmpSharpNet で OctetString を文字列にうまく復元する

More than 3 years have passed since last update.

NuGet で提供される SnmpSharpNet を利用した SNMP 関連のプログラミングをしていて、取得した OCTET STRING 値から文字列にうまく復元できない場合の解決法です。

SnmpSharpNet.AsnType 型から得る場合

本来であれば SnmpSharpNet.OctetString 型にキャストして、ToString メソッドを呼び出せば文字列に変換できます。しかし、日本語を含む場合などはとくに、本来の文字列には変換されず 16進数羅列の文字列に変換されてしまう場合があります。

  // 変数 value に AsnType 型の値で SJIS エンコード文字列が入っているとします
  var text = ((SnmpSharpNet.OctetString)value).ToString();
  // text : "95 73 8E 76 8B 63 82 C5 95 D6 97 98"

変換されていない場合は、IsHex プロパティが true になっています。
そこで、SnmpSharpNet.OctetString 型にキャストされたオブジェクトを ToArray メソッドでバイト配列にして、System.Text.Encoding を利用して文字列に復元します。

  var octetStr = (SnmpSharpNet.OctetString)value;
  var text = octetStr.IsHex ?
    System.Text.Encoding.GetEncoding("SHIFT_JIS").GetString(octetStr.ToArray()) :
    octetStr.ToString() ;
  // text : "不思議で便利"

おまけ

参考

otagaisama-1
自社の開発・運用で、皆様からの情報にとてもお世話になっています。ほぼ1人情SYSの身で、他のネット情報には少ないレアめなシステムを自社で使っている点でも、今めいたシステム情報入手面でも、Qiita のみなさまはとても貴重です。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away