X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=e2ap%2Fpkg%2Fconv%2Fbcd.go;h=d651ec15e7e7fcd80cf45a0c65f1ca08564c44ab;hb=14f827331f7ae565d33cdf23c82f7794d3fc2d0d;hp=bbd1c709aa52c7d2f10eaec6288ed72d88e53419;hpb=47942b4fd845472cd4f669bdcc5320be71f1570c;p=ric-plt%2Fsubmgr.git diff --git a/e2ap/pkg/conv/bcd.go b/e2ap/pkg/conv/bcd.go index bbd1c70..d651ec1 100644 --- a/e2ap/pkg/conv/bcd.go +++ b/e2ap/pkg/conv/bcd.go @@ -19,18 +19,18 @@ 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("") +}