Re: [PATCH] add hex en/decoding functions
Alexander Malysh <[email protected]>
| Newsgroups | gmane.comp.mobile.kannel.devel |
|---|---|
| Message-ID | <[email protected]> |
Hi,
beside indentation, coding style and comments like bullshit...
what is wrong with:
octstr_long_to_hex(...) -> octstr_format("%diouxX", long)
octstr_hex_to_long(...) -> strtol(octstr_get_cstr(...),NULL, 16)
Thanks,
Alex
Wilfried Goesgens schrieb:
> 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.