Подтвердить что ты не робот

Удаление символов 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()

Также, если я делаю что-то еще, очевидно, глупо здесь, было бы хорошо знать.

4b9b3361

Ответ 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, поэтому вам не нужно преобразовывать в строку.