Преобразовать os.Stdin в [] байт - PullRequest
0 голосов
/ 09 июня 2018

Я пытаюсь реализовать небольшой чат-сервер в golang с сквозным шифрованием.Запуск примера для сервера https://github.com/adonovan/gopl.io/tree/master/ch8/chat и клиента https://github.com/adonovan/gopl.io/blob/master/ch8/netcat3/netcat.go Я наткнулся на https://www.thepolyglotdeveloper.com/2018/02/encrypt-decrypt-data-golang-application-crypto-packages/ для шифрования и дешифрования в Go.

Функция для шифрования:

func encrypt(data []byte, passphrase string) []byte {
block, _ := aes.NewCipher([]byte(createHash(passphrase)))
gcm, err := cipher.NewGCM(block)
if err != nil {
    panic(err.Error())
}
nonce := make([]byte, gcm.NonceSize())
if _, err = io.ReadFull(rand.Reader, nonce); err != nil {
    panic(err.Error())
}
ciphertext := gcm.Seal(nonce, nonce, data, nil)
return ciphertext
}

в func main ():

   ciphertext := encrypt([]byte(os.Stdin), "password")
    mustCopy(conn, ciphertext)
    conn.Close()

os.Stdin - это os.file, а он необходим как []байт.Решение должно быть io.Reader или через буфер, но я не могу найти рабочее решение.

Я пытался

bytes.NewBuffer([]byte(os.Stdin))

и

reader := bytes.NewReader(os.Stdin)

Любой вводболее чем приветствуется.Извините, если я не вижу очевидной проблемы / решения здесь, так как я довольно нов.

1 Ответ

0 голосов
/ 09 июня 2018

os.Stdin является io.Reader.Вы не можете преобразовать его в []byte, но вы можете прочитать из него и данные, которые вы читаете из него, которые могут быть прочитаны в []byte.

.во многих терминалах чтение из os.Stdin дает данные построчно, вы должны прочитать из них полную строку.Чтение из os.Stdin может блокировать до тех пор, пока не будет доступна полная строка.

Для этого у вас есть много возможностей, можно использовать bufio.Scanner.

Вот какВы можете сделать это:

scanner := bufio.NewScanner(os.Stdin)
if !scanner.Scan() {
    log.Printf("Failed to read: %v", scanner.Err())
    return
}
line := scanner.Bytes() // line is of type []byte, exactly what you need
...