/* ================================================================================== Copyright (c) 2019 AT&T Intellectual Property. Copyright (c) 2019 Nokia Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================================================== */ package conv // // //----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- type bcdbase struct { convtbl string } func (bcd *bcdbase) index(c byte) int { for cpos, cchar := range bcd.convtbl { if cchar == rune(c) { return cpos } } return -1 } func (bcd *bcdbase) byte(i int) byte { if i < 0 && i > 15 { return '?' } 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]) if schar < 0 { return nil } if i%2 > 0 { buf[i/2] &= 0x0f buf[i/2] |= (uint8)(schar) << 4 } else { buf[i/2] = 0xf0 | ((uint8)(schar) & 0x0f) } } return buf } func (bcd *Tbcd) Decode(buf []byte) string { var strbytes []byte for i := 0; i < len(buf); i++ { var b byte b = bcd.byte(int(buf[i] & 0x0f)) //if b == '?' { // return "" //} strbytes = append(strbytes, b) b = bcd.byte(int(buf[i] >> 4)) //if b == '?' { // return "" //} strbytes = append(strbytes, b) } 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("") }