Skip to content

Instantly share code, notes, and snippets.

@mniak
Created May 29, 2023 05:36
Show Gist options
  • Save mniak/5da16e00cc94c1f3a9502b8dd5793538 to your computer and use it in GitHub Desktop.
Save mniak/5da16e00cc94c1f3a9502b8dd5793538 to your computer and use it in GitHub Desktop.
package main
import (
"fmt"
"io"
"io/ioutil"
"log"
"os"
)
type yvesDecoder struct {
inner io.Reader
}
func NewYvesDecoder(r io.Reader) io.Reader {
return &yvesDecoder{
inner: r,
}
}
func (d *yvesDecoder) decodeByte(b byte) byte {
return b>>5 | b<<3
}
func (d *yvesDecoder) Read(buffer []byte) (int, error) {
pc := len(buffer) / 2
buffer = buffer[:pc*2]
read, err := d.inner.Read(buffer)
for n := 0; n <= read && n <= (pc-1)*2; n += 2 {
buffer[n], buffer[n+1] = d.decodeByte(buffer[n]), d.decodeByte(buffer[n+1])
if n+1 < read {
buffer[n], buffer[n+1] = buffer[n+1], buffer[n]
}
}
return read, err
}
func handle(err error) {
if err != nil {
log.Fatal(err)
}
}
func ReadFile(name string) ([]byte, error) {
f, err := os.Open(name)
if err != nil {
return nil, err
}
defer f.Close()
decr := NewYvesDecoder(f)
return ioutil.ReadAll(decr)
}
func main() {
data, err := ReadFile("1.yves")
handle(err)
fmt.Println(string(data))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment