Fully implement GSM7 decode
Some checks failed
Benchmark BufferPool / RunBenchmarks (push) Failing after 17s
Run Tests / Test (push) Failing after 16s

This commit is contained in:
2024-07-31 12:45:31 +02:00
parent f847588a24
commit ad8eaff930
2 changed files with 49 additions and 75 deletions

View File

@@ -22,7 +22,7 @@ func (c *GSM7Coder) Encode(s string, buf *bytes.Buffer) error {
encodedSize := GSM7EncodesInto(&s) encodedSize := GSM7EncodesInto(&s)
cap := buf.Cap() cap := buf.Cap()
if cap < encodedSize { if cap < encodedSize {
buf.Grow(encodedSize-cap) buf.Grow(encodedSize - cap)
} }
for index, septet := range utf8 { for index, septet := range utf8 {
@@ -73,23 +73,26 @@ func (c *GSM7Coder) Encode(s string, buf *bytes.Buffer) error {
func (c *GSM7Coder) Decode(buf *bytes.Buffer) (string, error) { func (c *GSM7Coder) Decode(buf *bytes.Buffer) (string, error) {
gsm7 := buf.Bytes() gsm7 := buf.Bytes()
var ( var (
offset int = (len(gsm7) / 8) + 1 offset int
bitshift byte = 0 bitshift byte = 0
leap, shift bool leap bool
) )
outLength := GSM7DecodesInto(buf) outLength := GSM7DecodesInto(buf)
lengthDiff := outLength - len(gsm7) lengthDiff := outLength - len(gsm7)
gsm7 = append(gsm7, make([]byte, lengthDiff)...) gsm7 = append(gsm7, make([]byte, lengthDiff)...)
start := len(gsm7) - 2
// We don't care about the last byte // We don't care about the last byte
// Unless it's the %8....... // Unless it's the %8.......
// We'll deal with that later // We'll deal with that later
for index := len(gsm7) - 2; index >= 0; index-- { for index := start; index >= 0; index-- {
octet := gsm7[index] octet := gsm7[index]
bitshift = byte((index + 1) % 8) bitshift = byte((index % 7) + 1)
if bitshift == 7 { if bitshift == 7 {
leap = true leap = true
} }
offset = 1
// log.Println(offset, index, index+offset)
// log.Printf("Index:%-3d Offset:%-3d Bitshift:%-3d CurrentByte:%08b (%-3d) OffsetByte(%-3d):%08b (%-3d) Leap:%5v", index, offset, bitshift, gsm7[index], gsm7[index], index+offset, gsm7[index+offset], gsm7[index+offset], leap) // log.Printf("Index:%-3d Offset:%-3d Bitshift:%-3d CurrentByte:%08b (%-3d) OffsetByte(%-3d):%08b (%-3d) Leap:%5v", index, offset, bitshift, gsm7[index], gsm7[index], index+offset, gsm7[index+offset], gsm7[index+offset], leap)
mask := byte(255 << (8 - bitshift)) mask := byte(255 << (8 - bitshift))
@@ -107,36 +110,7 @@ func (c *GSM7Coder) Decode(buf *bytes.Buffer) (string, error) {
// log.Printf("Index:%-3d Offset:%-3d Bitshift:%-3d CurrentByte:%08b (%-3d) OffsetByte(%-3d):%08b (%-3d) Leap:%5v", index, offset, bitshift, gsm7[index], gsm7[index], index+offset, gsm7[index+offset], gsm7[index+offset], leap) // log.Printf("Index:%-3d Offset:%-3d Bitshift:%-3d CurrentByte:%08b (%-3d) OffsetByte(%-3d):%08b (%-3d) Leap:%5v", index, offset, bitshift, gsm7[index], gsm7[index], index+offset, gsm7[index+offset], gsm7[index+offset], leap)
leap = false leap = false
continue
if !leap {
buf.WriteByte(gsm7[index+offset])
}
if index == len(gsm7)-1 && gsm7[index] > 0 {
buf.WriteByte(gsm7[index])
}
// log.Printf("Index:%-3d Offset:%-3d Bitshift:%-3d CurrentByte:%08b (%-3d) OffsetByte:%08b (%-3d) Leap:%5v", index, offset, bitshift, gsm7[index], gsm7[index], gsm7[index-offset], gsm7[index-offset], leap)
if bitshift >= 7 {
if leap {
// log.Printf("Shift at Index:%-3d Offset:%-3d Bitshift:%-3d", index, offset, bitshift)
leap = false
bitshift = 0
offset++
shift = true
continue
}
// log.Printf("Leap at Index:%-3d Offset:%-3d Bitshift:%-3d", index, offset, bitshift)
leap = true
bitshift = 6
}
if shift {
offset = 1
}
} }
// log.Printf("Result: %+v", gsm7)
// for _, v := range gsm7 {
// log.Printf("%08b", v)
// }
return string(gsm7), nil return string(gsm7), nil
} }

View File

@@ -141,57 +141,57 @@ func TestGSM7DecodeSimpleASCIIString(t *testing.T) {
} }
} }
// func TestGSM7DecodeComplexASCIIString(t *testing.T) { func TestGSM7DecodeComplexASCIIString(t *testing.T) {
// coder := &GSM7Coder{} coder := &GSM7Coder{}
// var buf bytes.Buffer var buf bytes.Buffer
// input := longNot8nStringEncodedBytes input := longNot8nStringEncodedBytes
// expected := longNot8nString expected := longNot8nString
// buf.Write(input) buf.Write(input)
// actual, err := coder.Decode(&buf) actual, err := coder.Decode(&buf)
// if err != nil { if err != nil {
// t.Errorf("Expected no error, but got %v", err) t.Errorf("Expected no error, but got %v", err)
// } }
// if actual != expected { if actual != expected {
// t.Errorf("Expected '%v', but got '%v'", expected, actual) t.Errorf("Expected '%v', but got '%v'", expected, actual)
// } }
// } }
// func TestGSM7DecodeComplex8nASCIIString(t *testing.T) { func TestGSM7DecodeComplex8nASCIIString(t *testing.T) {
// coder := &GSM7Coder{} coder := &GSM7Coder{}
// var buf bytes.Buffer var buf bytes.Buffer
// input := long8nStringEncodedBytes input := long8nStringEncodedBytes
// expected := long8nString expected := long8nString
// buf.Write(input) buf.Write(input)
// actual, err := coder.Decode(&buf) actual, err := coder.Decode(&buf)
// if err != nil { if err != nil {
// t.Errorf("Expected no error, but got %v", err) t.Errorf("Expected no error, but got %v", err)
// } }
// if actual != expected { if actual != expected {
// t.Errorf("Expected '%v', but got '%v'", expected, actual) t.Errorf("Expected '%v', but got '%v'", expected, actual)
// } }
// } }
// func TestGSM7DecodeEmptyString(t *testing.T) { func TestGSM7DecodeEmptyString(t *testing.T) {
// coder := &GSM7Coder{} coder := &GSM7Coder{}
// buf := bytes.NewBuffer([]byte{}) buf := bytes.NewBuffer([]byte{})
// expected := "" expected := ""
// actual, err := coder.Decode(buf) actual, err := coder.Decode(buf)
// if err != nil { if err != nil {
// t.Errorf("Expected no error, but got %v", err) t.Errorf("Expected no error, but got %v", err)
// } }
// if actual != expected { if actual != expected {
// t.Errorf("Expected '%v', but got '%v'", expected, actual) t.Errorf("Expected '%v', but got '%v'", expected, actual)
// } }
// } }
// region insertat // region insertat
func TestInsertAtBeginning(t *testing.T) { func TestInsertAtBeginning(t *testing.T) {