January 23, 2003
Hej, jag ska omvandla ett värde jag läser av från en dator till en sträng. Värdet hämtar jag med olika requester från snmp-protokollet.
Om jag efter alla anrop och tilldelningar slutligen skriver:
cout << "Value = ";
SnmpUtilPrintAsnAny(&variableBindings.list[0].value);
cout << "n";
så får jag utskriften:
Value = Counter - 4027505761
Nu har jag länge försökt hitta på ett sätt att spara undan värdet 4027505761 i en variabel. Det enda sättet jag lyckats på är att skriva ut svaret på en fil och sedan läsa den (med batch programmering) men det är dumt och långsamt. Hade varit bättre att lagra undan i en variabel. Jag tänkte att det kanske vore lättast att använda mig av string och konvertera dit. Sedan plocka ut värdet och konvertera till en lämplig taltyp. Hur skall jag kunna konvertera denna? variableBindings.list[0].value är en så kallad SnmpVarBind eller en AsnAny tror jag. Snälla hjälp.
I värsta fall måste man ju kunna läsa det man skrivit ut på skärmen till en en sträng på något sätt?
January 7, 2003
tror att variableBindings.list[0].value är en AsnAny.
AsnAny är en struct med en byte + en union.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/snmp/snmp/asnany_str.asp
Altså, asnType innehåller vad det är för typ. Ifall du vet att det är en AsnInteger32 så är det bara att ta asnValue.
January 23, 2003
Tja, AsnAnyn jag får är ju "Counter - 4027505761". Jag har provat med flera typer, integer_32, counter_32, counter_64, octstring mm...
Jag tror inte jag förstår riktigt hur jag ska plocka ut värdet, får ett kompileringsfel liknande member identification required, men jag gör allt jag kan för att försöka förtydliga för kompilatorn vad det är.
January 7, 2003
nja, det är en debugg funktion, variableBindings.list[0].value är väl ditt värde. det handlar väl bara om att casta om den till nån användbar typ.
gör så här:
AsnAny *pAny= variableBindings.list[0].value;
switch(pAny->asnType)
{
case ASN_INTEGER: cout << "1"; break;
case ASN_INTEGER32: cout << "2"; break;
case ASN_UNSIGNED32: cout << "3"; break;
case ASN_COUNTER64: cout << "4"; break;
case ASN_OCTETSTRING: cout << "5"; break;
case ASN_BITS: cout << "6"; break;
case ASN_OBJECTIDENTIFIER: cout << "7"; break;
case ASN_SEQUENCE: cout << "8"; break;
case ASN_IPADDRESS: cout << "9"; break;
case ASN_COUNTER32: cout << "10"; break;
case ASN_GAUGE32: cout << "11"; break;
case ASN_TIMETICKS: cout << "12"; break;
case ASN_OPAQUE: cout << "13"; break;
}
nu vet du vad det är för typ. då är det bara att casta om skiten sedan.
January 7, 2003
mm men det är fel.
Countern är ett 32 bitars nummer (unsigned int skulle jag tro).
Man kan skriva följjande kod på en rad om man vill.
// Casta om till ett pAny object (datahållare)
AsnAny *pAny= &variableBindings.list[0].value;
// Hämta värdet av countern och kasta till en int.
unsigned int num= pAny->asnValue.counter;
// Detta skall skriva ut 4027505761
cout << num << endl;
January 7, 2003
funkade det?
ifall du inte kan c++ så är det svårt.
Pga att man sällan använder sig av vanliga typer (int,char etc) utan oftast har classer och struktar så vet man väldigt sällan vad sakerna är.
Å andra sidan så skall man inte behöva bry sig, fast ibland så måste även den bästa OO programmeraren bry sig.
January 23, 2003
Värdet jag hämtar är alltid en Counter, för jag läser av en räknare som räknare upp antalet bytes som kommer in och ut på en burk, tror det är en brygga. Jag ska göra ett ett program som mäter under låt säga 5 min, och sedan lagrar undan värdet knutet till en viss tid. Med datan jag får från programmet kan jag sedan jobba vidare och bygga diagram och se hur nättrafiken har rört sig under en tid.
1 Guest(s)