• Поиск по байтовому массиву?

    EvgenyMamonov
    @EvgenyMamonov Куратор тега Go
    Senior software developer, system architect
    Думаю это сильно зависит от того, как часто вам нужно делать поиск в этом файле.
    Если не часто - тогда можно просто вычитывать данные порциями, и искать последовательность в них.
    Если же очень часто - нужно понять что там за данные и думать как сделать индекс для поиска в этом файле.

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

    Еще, как вариант, можно сделать простенький индекс (упрощаю, чтобы было легче писать понятный пример)

    Допустим у нас есть файл с таким содержимым
    0x02 0x09 0x02 0x05 0x09 0x09, 0xf1 0xfa 0x02

    Найти нужно последовательность 0x02 0x05

    Строим индекс [массив байт от 0x00 до 0xff][слайс адресов этого байта в файле]
    т.е.
    [значение байта][адрес этого байта в файле1, адрес этого байта в файле2, адрес этого байта в файле3...]
    Для указанного файла индекс получится вот такой
    [0x00][]
    [0x01][]
    [0x02][0x00, 0x02, 0x08]
    ...
    [0x05][0x03]
    ...
    [0x09][0x01, 0x04, 0x05]
    ...
    [0xf1][0x06]
    ...
    [0xfa][0x07]
    ...

    Первый байт в искомой последовательности 0x02 0x05 - будет 0x02.
    Мы берём слайс в массиве по индексу 0x02 и получаем список адресов где в файле есть 0x02 - [0x00, 0x02, 0x08]
    А дальше вы проверяете вашу последовательность только начиная с полученных смещений
    Т.е. проверяем следующий байт по адресу 0x00 + 1 == 0x05 (второму символу последовательности) или нет.
    Если нет - значит берём след. смещение 0х02 и опять проверяем равен ли след. символ 0x05.
    Равен, значит нашли последовательность.
    Ответ написан
  • Как сделать вывод массива со сдвигом?

    @falconandy
    1. Строка text = '' * maximum + text выглядит бесполезной - для чего пустую строку пытаться реплицировать?
    2. Выхлоп вашего скрипта (на Python 3, но это не должно вроде влиять) отличается от вами приведенного. Не хватает укорачивания строк:
    ...
    wxxyyzz0011223344556677889900
    xxyyzz0011223344556677889900
    xyyzz0011223344556677889900
    yyzz0011223344556677889900
    yzz0011223344556677889900
    zz0011223344556677889900
    z0011223344556677889900
    0011223344556677889900
    011223344556677889900
    11223344556677889900
    1223344556677889900
    223344556677889900
    23344556677889900
    3344556677889900
    344556677889900
    44556677889900
    4556677889900
    556677889900
    56677889900
    6677889900
    677889900
    77889900
    7889900
    889900
    89900
    9900
    900
    00
    0

    3. Для текущей версии аналог на Go:
    package main
    
    func main() {
    	text := "aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz0011223344556677889900"
    	show(text, 30)
    }
    
    func show(text string, maximum int) {
    	for i := range text {
    		if i+maximum < len(text) {
    			println(text[i : i+maximum])
    		} else {
    			println(text[i:])
    		}
    	}
    }
    Ответ написан
    1 комментарий
  • Как в GO работать с GUI-библиотекой Winc?

    hugga
    @hugga
    Не знаю почему, но в списке awesome-go до сих пор нет одной прекрасной gui библиотеки (точнее биндинга к Dear ImGui) - AllenDang/giu
    Ответ написан
    1 комментарий
  • Как в GO искать группы подсовпадений в текстовом файле?

    @dodo512
    index out of range [0] with length 0

    Если FindAllStringSubmatch не найдёт совпадения с шаблоном, то result будет пуст.
    for _, fullName := range fullNames {
        result := r.FindAllStringSubmatch(fullName, -1)
        if len(result) == 0 {
            continue
        }
    Ответ написан
    1 комментарий