Удаление символов NUL из байтов
Чтобы научить себя, я создаю простой сервер, который принимает некоторые данные, выполняет некоторую обработку и отправляет выходные данные клиенту (включая исходный ввод).
Ввод может варьироваться в зависимости от длины от 5 до 13 символов + конечных линий и любого другого guff, который отправляет клиент.
Ввод считывается в массив байтов и затем преобразуется в строку для некоторой обработки. К этой строке добавляется еще одна строка, и все это преобразуется обратно в массив байтов для отправки обратно клиенту.
Проблема заключается в том, что вход дополняется связкой символов NUL, и я не уверен, как избавиться от них.
Итак, я мог бы перебирать массив и когда я возвращаюсь к нулевому символу, отмечаю длину (n), создаю новый массив байтов этой длины и копируем первые n символов в новый массив байтов и используем это, Это лучший способ, или есть что-то, чтобы сделать это легче для меня?
Некоторые удаленные коды:
data := make([]byte, 16)
c.Read(data)
s := strings.Replace(string(data[:]), "an", "", -1)
s = strings.Replace(s, "\r", "", -1)
s += "some other string"
response := []byte(s)
c.Write(response)
c.close()
Также, если я делаю что-то еще, очевидно, глупо здесь, было бы хорошо знать.
Ответы
Ответ 1
В пакете "байты" func Trim(s []byte, cutset string) []byte
является вашим другом:
Trim возвращает подсечку s, отсекая все предыдущие и завершающие UTF-8 кодированные коды кода Unicode, содержащиеся в cutset.
// Remove any NULL characters from 'b'
b = bytes.Trim(b, "\x00")
Ответ 2
Ваш подход звучит в основном правильно. Некоторые замечания:
-
Когда вы нашли индекс первого нулевого байта в data
, вам не нужно копировать, просто обрезайте срез: data[:idx]
.
-
bytes.Index должен быть в состоянии найти этот индекс для вас.
-
Существует также bytes.Replace
, поэтому вам не нужно преобразовывать в строку.