#include #include //#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 \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"); }