sometimes one must cope with converting numbers from hex to long, 
and vice versa. This is fine for the varous kinds of hex-pdus,
encoding and decoding them.


Wilfried G?sgens
--- a/gateway/gwlib/octstr.c    2006-03-17 11:19:43.000000000 +0100
+++ b/gateway/gwlib/octstr.c    2006-04-03 16:00:36.000000000 +0200
@@ -735,6 +737,54 @@
 }
 
 
+long octstr_hex_to_long(Octstr *ostr, int start, int end)
+{
+       int i;
+       long ret=0;
+       
+       /* if the string is too long, not *2 because of we aren't signed. */
+       if (end==0) end=ostr->len;
+       /* this is bullshit.    gw_assert(sizeof(long)<(end-start)); */
+       
+
+       for(i=start; i<end; i++)
+               {
+                       int hexc=0;
+                       /* 0-9 */
+                       hexc= toupper(ostr->data[i]) - 48;
+                       /* A-F ? */
+                       if (hexc > 9)
+                               hexc -= 7;
+                       /* none of the above? */
+                       if ((hexc < 0) || (hexc > 15))
+                               return -1;
+                       ret=(ret<<4)|hexc;
+               }
+    /* success */
+       return ret;
+
+}
+
+Octstr *octstr_long_to_hex(long data, long digits)
+{
+#define FIELDLEN 255
+       long resi, rest, n;
+       char ch[FIELDLEN+1]; /* the \0 */
+
+       rest=data;
+       ch[FIELDLEN+1]='\0';
+       for (n=0; n<digits; n++)
+               {
+                       resi=data%16;
+                       if (resi >9)
+                               ch[FIELDLEN-n]=55+resi;
+                       else 
+                               ch[FIELDLEN-n]=(char)48+resi;
+                       data=data/15;
+               }
+       return octstr_create(&ch[FIELDLEN-digits+1]);
+}
+
 long octstr_parse_long(long *nump, Octstr *ostr, long pos, int base)
 {
     /* strtol wants a char *, and we have to compare the result to
--- a/gateway/gwlib/octstr.h    2006-02-23 02:25:17.000000000 +0100
+++ a/gateway/gwlib/octstr.h    2006-04-03 15:51:01.000000000 +0200
@@ -266,6 +265,19 @@
  * encoding defined in RFC 2045. */
 void octstr_base64_to_binary(Octstr *ostr);
 
+/* Parse a hex ascii encoded number to its corrosponding long value 
+ * start: where to start searching 
+ * end: where to end searching. if 0 set to the length of octstr
+ */
+long octstr_hex_to_long(Octstr *ostr, int start, int end);
+
+/* convert a long value to a hexadecimal representation. 
+ * data is the number to print, digits is the number of
+ * digits that will be used in the string. 
+ * it works right to left, so the decimal point is the anchor 
+ * digits is counted from. larger values will be cut.
+ */
+Octstr *octstr_long_to_hex( long data, long digits);
 
 /* Parse a number at position 'pos' in 'ostr', using the same rules as
  * strtol uses regarding 'base'.  Skip leading whitespace.

Reply via email to