Nik
Народ, а подскажите, как нормально работать с байтами? я ща рисую конструкции вида copy(raw[8:12], []byte(Header.Eye)) copy(raw[12:16], []byte(Header.Vesrion)) copy(raw[16:20], []byte(Header.Type))
Nik
а слышал, что сожно играть как то со смещениями?
Nik
или это только для интов? (я про операторы вида >>)
Nik
эм... постановка задачи есть?
маршал/анмаршал бинарных данных.
Alexey
Похоже, что bytes.Buffer и пакет binary
Michael
маршал/анмаршал бинарных данных.
обычно у них пакет имеет строго опред. длину, поэтому можно аллоцировать массив байт заранее
Alexey
Типа binary.BigEndian.Read
Michael
та может там и liitle endian & mixed
Michael
или bcd & gsm7
Alexey
Конечно. Это просто пример, который не сразу виден в документации
Nik
Типа binary.BigEndian.Read
это для числовых то использую binary.LittleEndian.Uint16([]byte(raw)[20:22]),
Alexey
Там есть Read, который может читать сразу много полей в структуру
Alexey
Ну и bytes.Buffer тоже поможет
Nik
А в обратку он умеет?
Alexey
Write тоже есть
Nik
Alexey
https://golang.org/pkg/encoding/binary/#Read
Nik
а, он от пакета пляшет, спс.
Vasily
https://blog.golang.org/survey2017-results
Nik
https://golang.org/pkg/encoding/binary/#Read
со string как я понимаю не полетит? или поймет 0x00 как конец строки?
Alexey
Не будет работать со строками, скорее всего
Alexey
Со слайсами байт – будет
Daniel
со string как я понимаю не полетит? или поймет 0x00 как конец строки?
само по себе не поймет. надо заводить bufio.Reader и на нем запускать ReadBytes
Nik
само по себе не поймет. надо заводить bufio.Reader и на нем запускать ReadBytes
Там фикс длинна, так что вполне позовлительно
Nik
Но [n]byte как тип человечески к стрингам кажется не приводился к стрингам по моему посдлденему опыту. Пойду попробую еще раз
Kirill
https://blog.golang.org/survey2017-results
я всё еще ржу насчёт
Kirill
Nik
cannot convert data.Mine (type [3]byte) to type string 😔
Daniel
это не слайс, а массив
Kirill
Daniel
а мог бы дать парню погуглить
Nik
а мог бы дать парню погуглить
вот одновременно с этим и прогуглил)
Kirill
а мог бы дать парню погуглить
ну - извините, иногда помогаю людям, я исправлюсь :)
Kirill
😄
Nik
-200 строк из кода, хороший вечер)
Kirill
кстати, @onokonem, мне нужны твои ~мозги~ мысли по одному поводу)
Daniel
давай
Kirill
в личку закину, минуту
Daniel
ок
Kirill
закинул
Wingman
народ, а что будет быстрее и правильнее? 1) if strings.HasPrefix('xe') || strings.HasPrefix('ge') || strings.HasPrefix('te') ............... { } 2) регулярка типа ^(xe|ge|te|....) ?
Kirill
я бы делал, грубо говоря, len(str) >= 2 && str[1] == 'e' && (str[0] == 'x' || str[0] == 'g' || str[0] == 't')
Wingman
не
Kirill
но, возможно, за такой код меня уже кто-то ненавидит :))
Wingman
пример тебя ввел в заблуждение, там совсем не обязательно [1] == 'e' )
Wingman
любые 2-3 первых символа могут быть, которые необходимо отматчить
Wingman
до десятка в одном if
Kirill
я бы возненавидел
я такой код документирую и объясняю, почему надо было так :))
Илья
Switch по первым двум символам, в case их можно перечислить
Daniel
народ, а что будет быстрее и правильнее? 1) if strings.HasPrefix('xe') || strings.HasPrefix('ge') || strings.HasPrefix('te') ............... { } 2) регулярка типа ^(xe|ge|te|....) ?
откуда взялся этот вопрос? были замеры, и регулярки оказались медленными? в любом случае, быстрее всего будет, наверное switch str[:2] { case "xe": ... case "ge": ... case "te": ... }
Kirill
Kirill
но это не так читаемо
Kirill
и вряд ли у тебя будет случай, когда ты бы упёрся в регулярку, которую тебе на прототип хватит с головой, а переделать ты после замеров успеешь практически всегда
Wingman
да не, не упрусь-то точно
Wingman
блин
Wingman
да это ващщщще некритичный участок
Wingman
просто решил спросить, как оптимальнее :)
Илья
Ну, регулярка тут оверкилл страшный
Илья
Тоже верно
Daniel
если кому-то охота упороться
Илья
просто решил спросить, как оптимальнее :)
Кстати, всегда можно сделать бенч, если не лень. Заодно попрактиковаться делать бенчи
Wingman
ну да, вариант
Daniel
не надо делать микробенчи. не надо. надо померять интегральную производительность, и все остальное делать тольео есть ее не хватает
Kirill
binary.BigEndian.Uint16([]byte(str[:2]))
скорее всего, шустрее будет https://godoc.org/github.com/gramework/runtimer#BytesHash :)
Kirill
строго говоря, там обычный memhash
Kirill
но 14 операций + 7 конвертаций - больше, чем 6 конвертаций (которые оптимизируются compile-time) и 11 операций
Kirill
(ref: runtime/hash64.go#L31, encoding/binary/binary.go#L77-78)
Nik
Вопрос обратный возник - как перегнать string в [n]bytes? я сходу ответ ненагуглил
Nik
ваиринат с copy не позволяет это почеловечески записать в структуру без временных переменных
Aleksandr
[strlen(...)]byte(str)
Aleksandr
Как нибудь так
Nik
[4]byte("ABCD"),