質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SNMP

SNMPとは【Simple Network Management Protocol)】 ネットワークに接続しているデバイス等の情報を 収集し、ネットワーク監視や制御の管理を行うためのプロトコルです。

Q&A

解決済

3回答

4854閲覧

SNMPのOidを16進数にしてbyte配列に格納したい

panda12

総合スコア11

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SNMP

SNMPとは【Simple Network Management Protocol)】 ネットワークに接続しているデバイス等の情報を 収集し、ネットワーク監視や制御の管理を行うためのプロトコルです。

0グッド

0クリップ

投稿2017/08/02 14:23

###前提・実現したいこと
C#でSNMPTrapをライブラリを使わずにパケットを直に
送信したいと考えています。

作成している最中にOidのパケット変換で躓いてしまったので質問をさせて頂きます。

1.3.6.1.4.1.311.21.20
のOidを
0x2B 0x06 0x01 0x04 0x01 0x82 0x37 0x15 0x14
の形にしてバイト配列に16進数で格納したいと考えています。

ネットで調べた所10進数→16進数の変換にbitConverterクラスを使う方法が
あることがわかり下記のソースコードのように試してみましたが上手く
変換されませんでした。

初歩的な質問で申し訳ありませんが
Oidを16進数に変換しbyte配列に保存する方法を教えていただきたいです。

###発生している問題・エラーメッセージ
16進数に変換されない

###該当のソースコード

C#

1namespace SNMPTrap 2{ 3 class Program 4 { 5 6 static void Main(string[] args) 7 { 8 string remoteHost = "127.0.0.1"; 9 int remotePort = 162; 10 UdpClient udp = new UdpClient(); 11 12 byte[] Oid = ConvertToOid("1.3.6.1.4.1.311.21.20"); 13 udp.Send(Oid, Oid.Length, remoteHost,remotePort); 14 } 15 16 public static byte[] ConvertToOid(string str) 17 { 18 string[] splitData = str.Split('.'); 19 byte[] data = new byte[splitData.Length]; 20 byte[] buf = new byte[1]; 21 for (int j = 0; j < splitData.Length; j++) 22 { 23 buf = BitConverter.GetBytes(Convert.ToInt16(splitData[j])); 24 data[j] = buf[0]; 25 } 26 return data; 27 } 28 29 } 30 31}

###試したこと
文字列を'.'で区切り
C#のbitCOnverter.GetBytes()を使い16進数のバイト変換を試みました。

###補足情報(言語/FW/ツール等のバージョンなど)
C# framework4.6 visualstudio2013

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

SNMPのOIDは、ASN.1バイナリ変換規則により変換されます。
ASN.1 バイナリ変換規則 (BER, CER, DER) - OBJECT IDENTIFIER

  • 1~2オクテットは、規定の手順によりバイナリ変換を行います。

1オクテットの値に40を掛けて、2オクテットの値と足し合わせ、バイナリ化します。

  • 3オクテット以降は、7ビットごとにデータを分割し、符号ビットを先頭に付与して8ビットにします。

投稿2017/08/04 09:35

ester41

総合スコア148

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

panda12

2017/08/04 11:36

変換規則大変勉強になりました。 適切な回答ありがとうございます。
guest

0

1.3.6.1.4.1.311.21.20

のOidを
0x2B 0x06 0x01 0x04 0x01 0x82 0x37 0x15 0x14
の形にしてバイト配列に16進数で格納したいと考えています。

とありますが、10進数文字列を整数に変換し、byte配列に格納するでよろしいでしょうか。
上記Oidの場合、311は2バイト必要ですので、各々2バイト単位に変換する必要があると考えます。

311 -> 0x0137
1.3.6.1.4.1.311.21.20 ->
0x00 0x01 0x00 0x03 0x00 0x06 0x00 0x01 0x00 0x04 0x00 0x01 0x01 0x37 0x00 0x15 0x00 0x14

2バイト単位で処理するように、修正してみました。
出力は以下となります。
"00-01-00-03-00-06-00-01-00-04-00-01-01-37-00-15-00-14"

C#

1 static void Main(string[] args) 2 { 3 4 byte[] Oid = ConvertToOid("1.3.6.1.4.1.311.21.20"); 5 6 // 変換後のOidを16進数で表示 7 Console.WriteLine(BitConverter.ToString(Oid)); 8 } 9 10 public static byte[] ConvertToOid(string str) 11 { 12 string[] splitData = str.Split('.'); 13 List<byte> bytes = new List<byte>(); 14 15 for (int j = 0; j < splitData.Length; j++) 16 { 17 byte[] buf = BitConverter.GetBytes(Convert.ToInt16(splitData[j])); 18 bytes.Add(buf[1]); // 整数に変換後の上位バイト 19 bytes.Add(buf[0]); // 整数に変換後の下位バイト 20 } 21 return bytes.ToArray(); 22 }

投稿2017/08/03 23:53

akiruno-oneone

総合スコア815

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

panda12

2017/08/04 11:38

>10進数文字列を整数に変換し、byte配列に格納するでよろしいでしょうか。 はい、10進数→16進数の変換については相違ありません。 大変わかりやすいソースコードをありがとうございます。 ester41様の回答と照らし合わせて自己解決できました。
guest

0

SNMPのOidの仕様は知らないのですが、

1.3.6.1.4.1.311.21.20
のOidを
0x2B 0x06 0x01 0x04 0x01 0x82 0x37 0x15 0x14
の形にしてバイト配列に16進数で格納したいと考えています。

とすると、最初の 1,3 -> 0x2B 部分と、311 -> 0x82,0x37 部分がよくわかりません。
先頭部分や、2byteを超える場合の変換に特殊な仕様はありませんでしょうか?

投稿2017/08/03 23:36

mituha

総合スコア385

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

panda12

2017/08/04 11:41

回答ありがとうございます。 mituha様のおっしゃる通りASN.1という変換規則による変換処理だったようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問