diff --git a/encoding/gsm7.go b/encoding/gsm7.go index 688524a..acdd28d 100644 --- a/encoding/gsm7.go +++ b/encoding/gsm7.go @@ -65,29 +65,41 @@ func (c *GSM7Coder) Encode(s string, buf *bytes.Buffer) error { func (c *GSM7Coder) Decode(buf *bytes.Buffer) (string, error) { gsm7 := buf.Bytes() var ( - output []byte = make([]byte, len(gsm7)*8/7) offset int = (len(gsm7) / 8) + 1 bitshift byte = 0 leap, shift bool ) - log.Println(len(output)) + outLength := len(gsm7)*8/7 + lengthDiff := outLength - len(gsm7) + gsm7 = append(gsm7, make([]byte, lengthDiff)...) + // 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-- { octet := gsm7[index] bitshift = byte((index + 1) % 8) if bitshift == 7 { leap = true } - log.Printf("Index:%-3d Offset:%-3d Bitshift:%-3d CurrentByte:%08b (%-3d) Output(%-3d):%08b (%-3d) Leap:%5v", index, offset, bitshift, gsm7[index], gsm7[index], index+offset, output[index+offset], output[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)) masked := (mask & octet) >> (8 - bitshift) log.Printf("Index:%-3d Offset:%-3d Bitshift:%-3d Mask:%08b Masked:%08b", index, offset, bitshift, mask, masked) - output[index+offset] |= masked - - continue - gsm7[index+offset] |= masked + if leap { + InsertAt(&gsm7, index+offset, masked) + } else { + gsm7[index+offset] |= masked + } + // Remove last bitshift bits gsm7[index] <<= bitshift + // Move the remaining bit once to the right to form septet instead of octet + gsm7[index] >>= 1 + + 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]) @@ -113,7 +125,11 @@ func (c *GSM7Coder) Decode(buf *bytes.Buffer) (string, error) { offset = 1 } } - return "", nil + log.Printf("Result: %+v", gsm7) + for _, v := range gsm7 { + log.Printf("%08b", v) + } + return string(gsm7), nil } // Allocation free