ページ 11

部分文字列を置き換えする方法

Posted: 2010年7月07日(水) 18:01
by トマト
IPアドレスを全て3文字づつにするやり方を教えてください

何度もお世話になり本当にその際はありがとうございました。

iso.3.6.1.2.1.4.22.1.2.1061.193.168.60.16 = Hex-STRING: 00 1B 8D CC 12 C2
iso.3.6.1.2.1.4.22.1.2.1061.193.168.61.178 = Hex-STRING: 00 24 EF 5A 1E F0

を以下に切り出す処理を入れています。
193.168.60.16,00 1B 8D CC 12 C2
193.168.61.178,00 24 EF 5A 1E F0

ですが、IPアドレスの不ぞろいな為「iso.3.6.1.2.1.4.22.1.2.1061.」があったら
193.168.60.16だけにするとの処理なのですが
必ずしも「iso.3.6.1.2.1.4.22.1.2.1061.」が一字一句同じなものがあまりないため
汎用的にするため、文字列の長さを同じにしたいのです。

「iso.3.6.1.2.1.4.22.1.2.1061.」
「iso.3.6.1.2.1.4.22.1.2.132.」
「iso.3.6.1.2.1.4.22.1.2.3.」とまちまちな為「192.」があったら

「193.168.60.16」-> 「193.168.060.016」
「193.168.61.178」-> 「193.168.061.178」
とする。
のようにするには、どうしたらいいのでしょうか?

大変申し訳ありませんが、もうずっと出来なくてなやんでしまいこちらに相談にきました
よろしくお願いいたします

Re:部分文字列を置き換えする方法

Posted: 2010年7月07日(水) 18:53
by シエル
>>ですが、IPアドレスの不ぞろいな為「iso.3.6.1.2.1.4.22.1.2.1061.」があったら
>>193.168.60.16だけにするとの処理なのですが
>>必ずしも「iso.3.6.1.2.1.4.22.1.2.1061.」が一字一句同じなものがあまりないため
>>汎用的にするため、文字列の長さを同じにしたいのです。
>>「iso.3.6.1.2.1.4.22.1.2.1061.」
>>「iso.3.6.1.2.1.4.22.1.2.132.」
>>「iso.3.6.1.2.1.4.22.1.2.3.」とまちまちな為「192.」があったら
>>「193.168.60.16」-> 「193.168.060.016」
>>「193.168.61.178」-> 「193.168.061.178」
>>とする。

この辺の意味が良く分かりません。

まあIPを3文字にして、頭に0をつけたいのであれば、
「.」を区切り位置として、フォーマット指定子を駆使すれば、何とかなるのではないでしょうか?

Re:部分文字列を置き換えする方法

Posted: 2010年7月07日(水) 20:00
by Poco
参考になるか分かりませんが、プログラム載せておきます。

#SNMP-Trapメッセージの解析と言ったほうが、伝わると思いますよ。

----hoge.c----
#include <stdio.h>

char oid[/url] = "iso.3.6.1.2.1.4.22.1.2.";

char * snmpTrapMsg[/url] = {
"iso.3.6.1.2.1.4.22.1.2.1061.193.168.60.16 = Hex-STRING: 00 1B 8D CC 12 C2",
"iso.3.6.1.2.1.4.22.1.2.1061.193.168.61.178 = Hex-STRING: 00 24 EF 5A 1E F0",
NULL,
};


int main()
{
int offset = sizeof( oid ) - 1;
int dummy = -1;
int firstOctet = -1;
int secondOctet = -1;
int thirdOctet = -1;
int forthOctet = -1;
char ** p = snmpTrapMsg;

for ( ; *p; p++ ) {
sscanf( &(*p)[offset], "%d.%d.%d.%d.%d", &dummy, &firstOctet, &secondOctet, &thirdOctet, &forthOctet);
printf("IP addres = %03d.%03d.%03d.%03d\n",firstOctet, secondOctet, thirdOctet, forthOctet);
}
}

Re:部分文字列を置き換えする方法

Posted: 2010年7月08日(木) 09:44
by トマト
分かりにくくて申し訳ありません。

貰っている指示は、
iso.3.6.1.2.1.4.22.1.2.1061.193.168.60.16 = Hex-STRING: 00 1B 8D CC 12 C2
iso.3.6.1.2.1.4.22.1.2.1061.193.168.61.178 = Hex-STRING: 00 24 EF 5A 1E F1
iso.3.6.1.2.1.4.22.1.2.9.193.168.60.16 = Hex-STRING: 00 1B 8D CC 12 C3
iso.3.6.1.2.1.4.22.1.2.1029.193.168.61.178 = Hex-STRING: 00 24 EF 5A 1E F2
iso.3.6.1.2.1.4.22.1.2.1030.193.168.60.16 = Hex-STRING: 00 1B 8D CC 12 C4
iso.3.6.1.4.1.3224.17.1.3.1.2.0 = IpAddress: 193.168.60.16
iso.3.6.1.4.1.3224.17.1.3.1.3.0 = STRING: 00 1B 8D CC 12 C2
iso.3.6.1.2.1.4.22.1.2.4.193.168.60.16 = Hex-STRING: 00 1B 8D CC 12 C5

上記ログ情報を
193.168.60.16,00 1B 8D CC 12 C2
193.168.61.178,00 24 EF 5A 1E F1
193.168.60.16,00 1B 8D CC 12 C3
193.168.61.178,00 24 EF 5A 1E F2
193.168.60.16,00 1B 8D CC 12 C4
193.168.60.16,00 1B 8D CC 12 C5
にする事です。
iso.3.6.1.4.1.3224.17.1.3.1.2.0 = IpAddress: 193.168.60.16
iso.3.6.1.4.1.3224.17.1.3.1.3.0 = STRING: 00 1B 8D CC 12 C2
IPアドレスだけ、MACアドレスだけの情報は捨てる事。

だそうです。
今は、エクセルの置換みたいにしていますが、記述が多くてとんでもないプログラムになってしまいました。
どうしたらスムーズに処理できるのでしょうか。
何をどうしたら部分文字列の切り出しができるかわからない状態になってしまいました。

ぽこ さん、サンプルありがとうございました。
やってみます。

そして、
>#SNMP-Trapメッセージの解析と言ったほうが、伝わると思いますよ。

アドバイスありがとうございます。
ログを渡されているだけなので、このデータは何ぞや って感じでした。

Re:部分文字列を置き換えする方法

Posted: 2010年7月08日(木) 13:07
by トマト
文字列の途中にある192.168.・・・
をみつけたら文字列から切り出す方法は何かないでしょうか?

申し訳ないですが、どなた様か知恵を貸してくださりませんでしょうか?

Re:部分文字列を置き換えする方法

Posted: 2010年7月08日(木) 13:08
by シエル
strstrを使ってみてはどうでしょうか

Re:部分文字列を置き換えする方法

Posted: 2010年7月08日(木) 13:54
by ideyan
ある程度文字列の書式が決まっているのだから
'=' を起点に '.' が4つ出てくるまで
長さをカウントしながら文字列を走査していって、
strncpyで一気にコピーするような愚直な方法じゃダメですかね?

Re:部分文字列を置き換えする方法

Posted: 2010年7月08日(木) 14:04
by トマト
strstrで切り出せました。
ありがとうございます!