From ad8eaff93091fb4c30f27b3e4af35895b63a9f97 Mon Sep 17 00:00:00 2001 From: PhatPhuckDave Date: Wed, 31 Jul 2024 12:45:31 +0200 Subject: [PATCH] Fully implement GSM7 decode --- encoding/gsm7.go | 44 +++++------------------- encoding/gsm7_test.go | 80 +++++++++++++++++++++---------------------- 2 files changed, 49 insertions(+), 75 deletions(-) diff --git a/encoding/gsm7.go b/encoding/gsm7.go index dd750c7..429443b 100644 --- a/encoding/gsm7.go +++ b/encoding/gsm7.go @@ -22,7 +22,7 @@ func (c *GSM7Coder) Encode(s string, buf *bytes.Buffer) error { encodedSize := GSM7EncodesInto(&s) cap := buf.Cap() if cap < encodedSize { - buf.Grow(encodedSize-cap) + buf.Grow(encodedSize - cap) } 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) { gsm7 := buf.Bytes() var ( - offset int = (len(gsm7) / 8) + 1 - bitshift byte = 0 - leap, shift bool + offset int + bitshift byte = 0 + leap bool ) outLength := GSM7DecodesInto(buf) lengthDiff := outLength - len(gsm7) gsm7 = append(gsm7, make([]byte, lengthDiff)...) + start := len(gsm7) - 2 // We don't care about the last byte // Unless it's the %8....... // We'll deal with that later - for index := len(gsm7) - 2; index >= 0; index-- { + for index := start; index >= 0; index-- { octet := gsm7[index] - bitshift = byte((index + 1) % 8) + bitshift = byte((index % 7) + 1) if bitshift == 7 { 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) 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) 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 } diff --git a/encoding/gsm7_test.go b/encoding/gsm7_test.go index be7c2e4..e2818c2 100644 --- a/encoding/gsm7_test.go +++ b/encoding/gsm7_test.go @@ -141,57 +141,57 @@ func TestGSM7DecodeSimpleASCIIString(t *testing.T) { } } -// func TestGSM7DecodeComplexASCIIString(t *testing.T) { -// coder := &GSM7Coder{} -// var buf bytes.Buffer -// input := longNot8nStringEncodedBytes +func TestGSM7DecodeComplexASCIIString(t *testing.T) { + coder := &GSM7Coder{} + var buf bytes.Buffer + input := longNot8nStringEncodedBytes -// expected := longNot8nString -// buf.Write(input) -// actual, err := coder.Decode(&buf) + expected := longNot8nString + buf.Write(input) + actual, err := coder.Decode(&buf) -// if err != nil { -// t.Errorf("Expected no error, but got %v", err) -// } + if err != nil { + t.Errorf("Expected no error, but got %v", err) + } -// if actual != expected { -// t.Errorf("Expected '%v', but got '%v'", expected, actual) -// } -// } + if actual != expected { + t.Errorf("Expected '%v', but got '%v'", expected, actual) + } +} -// func TestGSM7DecodeComplex8nASCIIString(t *testing.T) { -// coder := &GSM7Coder{} -// var buf bytes.Buffer -// input := long8nStringEncodedBytes +func TestGSM7DecodeComplex8nASCIIString(t *testing.T) { + coder := &GSM7Coder{} + var buf bytes.Buffer + input := long8nStringEncodedBytes -// expected := long8nString -// buf.Write(input) -// actual, err := coder.Decode(&buf) + expected := long8nString + buf.Write(input) + actual, err := coder.Decode(&buf) -// if err != nil { -// t.Errorf("Expected no error, but got %v", err) -// } + if err != nil { + t.Errorf("Expected no error, but got %v", err) + } -// if actual != expected { -// t.Errorf("Expected '%v', but got '%v'", expected, actual) -// } -// } + if actual != expected { + t.Errorf("Expected '%v', but got '%v'", expected, actual) + } +} -// func TestGSM7DecodeEmptyString(t *testing.T) { -// coder := &GSM7Coder{} -// buf := bytes.NewBuffer([]byte{}) +func TestGSM7DecodeEmptyString(t *testing.T) { + coder := &GSM7Coder{} + buf := bytes.NewBuffer([]byte{}) -// expected := "" -// actual, err := coder.Decode(buf) + expected := "" + actual, err := coder.Decode(buf) -// if err != nil { -// t.Errorf("Expected no error, but got %v", err) -// } + if err != nil { + t.Errorf("Expected no error, but got %v", err) + } -// if actual != expected { -// t.Errorf("Expected '%v', but got '%v'", expected, actual) -// } -// } + if actual != expected { + t.Errorf("Expected '%v', but got '%v'", expected, actual) + } +} // region insertat func TestInsertAtBeginning(t *testing.T) {