Hi, * Holger Freyther <[email protected]> [2010-07-08 20:04]: > On 07/08/2010 11:56 PM, Nico Golde wrote: > > I adjusted the copyright stanza in these files but I'm not > > completely sure if this is appropriate or not, so feel free > > to remove, I won't be offended :) > > The rule of thumb I heard is that anything above four lines > of code is copyrightable, so your addition is totally fine!
Ok. > I do have two nitpicks though. We do not indent the case labels > inside a switch statement Fixed, attached. > and the other is more important to me, > and might ask you to write a decoder, could you please update > the encoding/decoding and add the string that could not be > decoded by the current code? I felt this was coming :) I didn't write the decoder yet as it was quite time consuming already to go through the encoding process and I personally didn't need the decoding yet. But I agree, of course a decoder that fits the encoder is necessary (even though what could be properly decoded before also can be properly decoded now, no change for this). And I'm also willing to write it as soon as I have more time. As a string my example was '@' which should be encoded as 00 (1 byte hex) but is encoded as 40 instead by the current code. Cheers Nico
>From c0e829b6cc249971a41b30844c26fe7aa012aa75 Mon Sep 17 00:00:00 2001 From: Nico Golde <[email protected]> Date: Thu, 8 Jul 2010 20:14:17 +0200 Subject: [PATCH] * rewrite gsm_7bit_encode() based on a lookup table as the previous code produced wrong encodings for certain characters. --- include/osmocore/gsm_utils.h | 28 ++++++++++++++++++ src/gsm_utils.c | 64 ++++++++++++++++++++++++++++++++---------- 2 files changed, 77 insertions(+), 15 deletions(-) diff --git a/include/osmocore/gsm_utils.h b/include/osmocore/gsm_utils.h index 7dc2388..661846a 100644 --- a/include/osmocore/gsm_utils.h +++ b/include/osmocore/gsm_utils.h @@ -3,6 +3,7 @@ * (C) 2008 by Daniel Willmann <[email protected]> * (C) 2009 by Holger Hans Peter Freyther <[email protected]> * (C) 2009-2010 by Harald Welte <[email protected]> + * (C) 2010 by Nico Golde <[email protected]> * * All Rights Reserved * @@ -53,6 +54,33 @@ enum gsm_band { GSM_BAND_810 = 0x80, }; +/* ETSI GSM 03.38 6.2.1 and 6.2.1.1 default alphabet + * Greek symbols at hex positions 0x10 and 0x12-0x1a + * left out as they can't be handled with a char and + * since most phones don't display or write these + * characters this would only needlessly make the code + * more complex +*/ +unsigned char gsm_7bit_alphabet[] = { + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0a, 0xff, 0x0a, 0x0d, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x20, 0x21, 0x22, 0x23, 0x02, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, + 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, + 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, + 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, + 0x5a, 0x3c, 0x2f, 0x3e, 0x14, 0x11, 0xff, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, + 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, + 0x78, 0x79, 0x7a, 0x28, 0x40, 0x29, 0x3d, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x24, + 0x03, 0xff, 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0xff, 0xff, 0xff, + 0xff, 0x5b, 0x0e, 0x1c, 0x09, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5d, + 0xff, 0xff, 0xff, 0xff, 0x5c, 0xff, 0x0b, 0xff, 0xff, 0xff, 0x5e, 0xff, 0xff, 0x1e, 0x7f, + 0xff, 0xff, 0xff, 0x7b, 0x0f, 0x1d, 0xff, 0x04, 0x05, 0xff, 0xff, 0x07, 0xff, 0xff, 0xff, + 0xff, 0x7d, 0x08, 0xff, 0xff, 0xff, 0x7c, 0xff, 0x0c, 0x06, 0xff, 0xff, 0x7e, 0xff, 0xff +}; + const char *gsm_band_name(enum gsm_band band); enum gsm_band gsm_band_parse(const char *mhz); diff --git a/src/gsm_utils.c b/src/gsm_utils.c index dc97cef..ce5cefd 100644 --- a/src/gsm_utils.c +++ b/src/gsm_utils.c @@ -2,6 +2,7 @@ * (C) 2008 by Daniel Willmann <[email protected]> * (C) 2009 by Holger Hans Peter Freyther <[email protected]> * (C) 2009-2010 by Harald Welte <[email protected]> + * (C) 2010 by Nico Golde <[email protected]> * * All Rights Reserved * @@ -53,33 +54,66 @@ int gsm_7bit_decode(char *text, const uint8_t *user_data, uint8_t length) return i - l; } +/* GSM 03.38 6.2.1 Prepare character packing */ +static int gsm_septet_encode(uint8_t *result, const char *data) +{ + int i, y = 0; + uint8_t ch; + for(i = 0; i < strlen(data); i++){ + ch = data[i]; + switch(ch){ + case 0x0c: + case 0x5e: + case 0x7b: + case 0x7d: + case 0x5c: + case 0x5b: + case 0x7e: + case 0x5d: + case 0x7c: + result[y] = 0x1b; + result[y + 1] = gsm_7bit_alphabet[ch]; + y++; + break; + default: + result[y] = gsm_7bit_alphabet[ch]; + break; + } + y++; + } -/* GSM 03.38 6.2.1 Charachter packing */ + return y; +} + +/* GSM 03.38 6.2.1 Character packing */ int gsm_7bit_encode(uint8_t *result, const char *data) { - int i,j = 0; - unsigned char ch1, ch2; + int i,y,z = 0; + /* prepare for the worst case, every character expanding to two bytes */ + uint8_t *rdata = calloc(strlen(data) * 2, sizeof(uint8_t)); + uint8_t cb, nb; int shift = 0; - for ( i=0; i<strlen(data); i++ ) { + y = gsm_septet_encode(rdata, data); - ch1 = data[i] & 0x7F; - ch1 = ch1 >> shift; - ch2 = data[(i+1)] & 0x7F; - ch2 = ch2 << (7-shift); + for(i = 0; i < y; i++) { + if(shift == 7 && i + 1 < y){ + shift = 0; + continue; + } - ch1 = ch1 | ch2; + cb = (rdata[i] & 0x7f) >> shift; + if(i + 1 < y){ + nb = (rdata[i + 1] & 0x7f) << (7 - shift); + cb = cb | nb; + } - result[j++] = ch1; + result[z++] = cb; shift++; - - if ((shift == 7) && (i+1<strlen(data))) { - shift = 0; - i++; - } } + free(rdata); return i; } -- 1.7.1
