gpt4 book ai didi

go - 二进制到文本的编码,将字节替换为 golang 中预定义的唯一字符串

转载 作者:行者123 更新时间:2023-12-03 03:14:26 25 4
gpt4 key购买 nike

我正在尝试构建一个二进制到文本的编码器,能够将每个字节替换为预定义的唯一字符串,然后使用相同的字符串集解码回二进制。

我能够为简单的 .txt 文件制作编码器和解码器,但我希望这也适用于 .zip 文件。

编码器:

package main

import (
"archive/zip"
"bufio"
"encoding/json"
"fmt"
"io/ioutil"
"log"
"os"
"strings"
)

func main() {
// keys.json is a 256 words dictionary for every byte
keysFile, err := os.Open("keys.json")
if err != nil {
log.Printf("unable to read keys.json file , error : %v", err)
return
}

var keys []string

byteValue, _ := ioutil.ReadAll(keysFile)
if err := json.Unmarshal(byteValue, &keys); err != nil {
log.Printf("unable to unmarshal array , error : %v", err)
return
}

Encoder(keys)

}

func listFiles(file *zip.File) ([]byte, error) {
fileToRead, err := file.Open()
if err != nil {
msg := "Failed to open zip %s for reading: %s"
return nil, fmt.Errorf(msg, file.Name, err)
}
b := make([]byte, file.FileInfo().Size())
fileToRead.Read(b)

defer fileToRead.Close()

if err != nil {
return nil, fmt.Errorf("failed to read zip file : %s for reading , error : %s", file.Name, err)
}

return b, nil
}

func Encoder(keys []string) {
read, err := zip.OpenReader("some.zip")
if err != nil {
msg := "Failed to open: %s"
log.Fatalf(msg, err)
}
defer read.Close()

var encodedBytes []byte
f, err := os.Create("result.txt")
w := bufio.NewWriter(f)

defer f.Close()
for _, file := range read.File {
readBytes, err := listFiles(file)
if err != nil {
log.Fatalf("Failed to read %s from zip: %s", file.Name, err)
continue
}

for i, b := range readBytes {

for _, eb := range []byte(keys[b] + " ") {
encodedBytes = append(encodedBytes, eb)
}

}

}
_, err = w.Write(encodedBytes)
if err != nil {
log.Printf("error :%v", err)
return
}
}

解码器:

    func Decoder(keys []string) {
inputFile, err := os.Open("result.txt")
if err != nil {
log.Printf("unable to read file , error : %v", err)
return
}

inputBytes, _ := ioutil.ReadAll(inputFile)

var (
current []byte
decoded []byte
)

for _, c := range inputBytes {
if c != 32 {
current = append(current, c)
} else {

for i, key := range keys {
if string(current) == key {
decoded = append(decoded, byte(i))
break
}
}
current = []byte{}
}
}

// here i want the decoded back into zip file
}

here Nodejs 中也是类似的。

最佳答案

有两件事:

  • 您正确地处理了空格,但没有正确地处理换行符。
  • 您的解码器循环错误。据我所知,它应该如下所示:
for i, key := range keys {
if string(current)==key {
decoded=append(decoded,i)
break
}
}

此外,您的解码是一个int数组,而不是一个字节数组。

关于go - 二进制到文本的编码,将字节替换为 golang 中预定义的唯一字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58490798/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com