plmn id handling improved
[ric-plt/submgr.git] / e2ap / pkg / conv / bcd.go
index bbd1c70..d651ec1 100644 (file)
 
 package conv
 
-type Bcd struct {
-       ConvTbl string
-}
+//
+//
 
-func NewBcd(convTbl string) *Bcd {
-       b := &Bcd{}
-       b.ConvTbl = convTbl
-       return b
+//-----------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------
+type bcdbase struct {
+       convtbl string
 }
 
-func (bcd *Bcd) index(c byte) int {
-       for cpos, cchar := range bcd.ConvTbl {
+func (bcd *bcdbase) index(c byte) int {
+       for cpos, cchar := range bcd.convtbl {
                if cchar == rune(c) {
                        return cpos
                }
@@ -38,14 +38,86 @@ func (bcd *Bcd) index(c byte) int {
        return -1
 }
 
-func (bcd *Bcd) byte(i int) byte {
+func (bcd *bcdbase) byte(i int) byte {
        if i < 0 && i > 15 {
                return '?'
        }
-       return bcd.ConvTbl[i]
+       return bcd.convtbl[i]
+}
+
+//-----------------------------------------------------------------------------
+//
+// 5 digit example
+// String format   : D1D2D3D4D5
+// BCD Coded format: 0xD1D2 0xD3D4 0xD50f
+// String format   : D1D2D3D4D5F
+//
+// 6 digit example
+// String format   : D1D2D3D4D5D6
+// BCD Coded format: 0xD1D2 0xD3D4 0xD5D6
+// String format   : D1D2D3D4D5D6
+//
+//-----------------------------------------------------------------------------
+type Bcd struct {
+       bcdbase
 }
 
 func (bcd *Bcd) Encode(str string) []byte {
+       buf := make([]byte, len(str)/2+len(str)%2)
+       for i := 0; i < len(str); i++ {
+               var schar int = bcd.index(str[i])
+               if schar < 0 {
+                       return nil
+               }
+               if i%2 > 0 {
+                       buf[i/2] &= 0xf0
+                       buf[i/2] |= ((uint8)(schar) & 0x0f)
+               } else {
+                       buf[i/2] = 0x0f | (uint8)(schar)<<4
+               }
+
+       }
+       return buf
+}
+
+func (bcd *Bcd) Decode(buf []byte) string {
+       var strbytes []byte
+       for i := 0; i < len(buf); i++ {
+               var b byte
+
+               b = bcd.byte(int(buf[i] >> 4))
+               //if b == '?' {
+               //      return ""
+               //}
+               strbytes = append(strbytes, b)
+
+               b = bcd.byte(int(buf[i] & 0x0f))
+               //if b == '?' {
+               //      return ""
+               //}
+               strbytes = append(strbytes, b)
+       }
+       return string(strbytes)
+}
+
+//-----------------------------------------------------------------------------
+//
+// 5 digit example
+// String format   : D1D2D3D4D5
+// TBCD Coded format: 0xD2D1 0xD4D3 0x0fD5
+// String format   : D1D2D3D4D5F
+//
+// 6 digit example
+// String format   : D1D2D3D4D5
+// TBCD Coded format: 0xD2D1 0xD4D3 0xD6D5
+// String format   : D1D2D3D4D5D6
+//
+//-----------------------------------------------------------------------------
+type Tbcd struct {
+       bcdbase
+}
+
+func (bcd *Tbcd) Encode(str string) []byte {
        buf := make([]byte, len(str)/2+len(str)%2)
        for i := 0; i < len(str); i++ {
                var schar int = bcd.index(str[i])
@@ -62,7 +134,7 @@ func (bcd *Bcd) Encode(str string) []byte {
        return buf
 }
 
-func (bcd *Bcd) Decode(buf []byte) string {
+func (bcd *Tbcd) Decode(buf []byte) string {
        var strbytes []byte
        for i := 0; i < len(buf); i++ {
                var b byte
@@ -80,3 +152,43 @@ func (bcd *Bcd) Decode(buf []byte) string {
        }
        return string(strbytes)
 }
+
+//-----------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------
+
+func NewBcd(convTbl string) *Bcd {
+       b := &Bcd{}
+       if len(convTbl) == 16 {
+               b.convtbl = convTbl
+       } else {
+               b.convtbl = "0123456789?????f"
+       }
+       return b
+}
+
+func NewTbcd(convTbl string) *Tbcd {
+       b := &Tbcd{}
+       if len(convTbl) == 16 {
+               b.convtbl = convTbl
+       } else {
+               b.convtbl = "0123456789*#abcf"
+       }
+       return b
+}
+
+//-----------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------
+
+var BCD *Bcd
+var TBCD *Tbcd
+
+//-----------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------
+
+func init() {
+       BCD = NewBcd("")
+       TBCD = NewTbcd("")
+}