Benutzer-Werkzeuge

Webseiten-Werkzeuge


contiki:snmp_ber_encoder_source
#include <stdio.h>
#include <string.h>
 
//#define DEBUG
 
void main(int argc, char *argv[]) {
	char* src;
#ifdef DEBUG
	printf("argc = %d\n",argc);
	printf("length of int = %d\n",sizeof(int));
#endif
	if (argc == 2) {
		src = argv[1];
	} else {
		printf("error: wrong number of arguments\n\n");
		printf("the input format:\n");
		printf("./oid-encoder <oid>\n\n");
		printf("example:\n");
		printf("./oid-encoder 1.3.6.1.2.2.4\n\n");
 
		return;
	}
#ifdef DEBUG
	printf("src= %c\n",*src);
	printf("int('0')=%d\n",'0');
#endif
	int num[1000];
	int len = 0;
	int val = 0;
	int i;
	//Routine um einzelne Char Zahlen zu INT zu konvertieren + Trennzeichen Erkenner
	for (i = 0; i < strlen(src) + 1; i++) {
		if (i < strlen(src) && src[i] >= '0' && src[i] <= '9') {
		//solange Zahl erkennen bis Trennzeichen kommt, also entweder kleiner '0' (ASCII 48) oder größer '9' (ASCII 58)
			val = val * 10 + src[i] - '0';
			//Char to Int Conversion + Dez. Erkennung
#ifdef DEBUG
			printf("Value=%d\n",val);
#endif
		} else {
		//Wenn Trennzeichen erkannt wurde, dann...
#ifdef DEBUG
			printf("Trennzeichen erkannt");
#endif
			num[len] = val;
#ifdef DEBUG
			printf(" Zahl = %d\n",num[len]);
#endif
			len++;			
			val = 0;
		}
	}
 
	unsigned char str[] = {0x13, 0x14};
 
	printf("{");
    val = num[0] * 40 + num[1];
	//printf erste Hex Ziffer (erste Zahl*40 + 2.Zahl)(also meist 1*40+3=43)
	printf("0x%02x", val);
 
	for (i = 2; i < len; i++) {
	//Erkennung wieviele Byte genutzt werden müssen
	//Pro Byte stehen immer 2^7 zur Verfügung, da MSB als Erkennung ob weitere Byte zur Zahlen gehören
	//genutzt wird. (Bei MSB=1, weitere folgen... MSB=0 letztes Byte zur Zahl)
		int value = num[i];
		int length = 0;
		if (value >= (268435456)) { // 2 ^ 28
			length = 5;
		} else if (value >= (2097152)) { // 2 ^ 21
			length = 4;
		} else if (value >= 16384) { // 2 ^ 14
			length = 3;
		} else if (value >= 128) { // 2 ^ 7
			length = 2;
		} else {
			length = 1;
		}
#ifdef DEBUG
		printf("\n %d Bytes werden benoetigt.\n",length);
		printf("fuer die Zahl %d\n",num[i]);
		//nur für Debug
		int x=1;
		printf("\n Binaer=");
		for(x=(sizeof(num[i]) * 8) - 1; x >= 0;x--)
		{
			printf("%d",(num[i] & (0x01 << x)) > 0);
		}
		printf("\n");
		//ende debug
#endif
 
		int j = 0;
		for (j = length - 1; j >= 0; j--) {
		    if (j) {
#ifdef DEBUG
				printf("\n j>0 j=%d \n",j);
#endif
				int p = ((value >> (7 * j)) & 0x7F) | 0x80;
		        printf(", 0x%02x", p);
				//nur für Debug
#ifdef DEBUG
				int x=1;
				printf("\n Binaer=");
				for(x=(sizeof(p) * 8) - 1; x >= 0;x--)
				{
					printf("%d",(p & (0x01 << x)) > 0);
				}
				printf("\n");
				//debug
#endif
		    } else {
#ifdef DEBUG
				printf("\n j<0 j=%d \n",j);
#endif
		        int p = ((value >> (7 * j)) & 0x7F);
		        printf(", 0x%02x", p);
#ifdef DEBUG
								//nur für Debug
				int x=1;
				printf("\n Binaer=");
				for(x=(sizeof(p) * 8) - 1; x >= 0;x--)
				{
					printf("%d",(p & (0x01 << x)) > 0);
				}
				printf("\n");
				//ende debug
#endif
		    }
		}
	}
	printf("};\n");
}
Diese Website verwendet Cookies. Durch die Nutzung der Website stimmen Sie dem Speichern von Cookies auf Ihrem Computer zu. Außerdem bestätigen Sie, dass Sie unsere Datenschutzbestimmungen gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information
contiki/snmp_ber_encoder_source.txt · Zuletzt geändert: 2017/01/24 18:49 von 127.0.0.1