среда, 9 ноября 2022 г.

Binary grep

В базе материализовалась запись, которая приводит к ошибкам вида org.postgresql.util.PSQLException: ERROR: invalid byte sequence for encoding "UTF8": 0xed 0x70 0x69. Возникает такое когда кто-то сделал изменение в таблице, но при этом соединение с базой не было настроено на UTF-8.

По прошлому опыту, данные вставили в кодировке latin1 и там будут символы вроде "í", "é", "á" или им подобные. Можно записать байтики в файлик и использовать его как паттерн для grep, но захотелось возможности грепать сразу в виде байтов.

Вот тут советуют ставить grep в неудобную позу и иногда оно даже работает, но для нескольких кейсов у меня не прошло. С этой же странички узнал для себя несколько новых тулов: binwalk и bgrep. Про binwalk уже слышал ранее в контексте ковыряния прошивок, а про bgrep слышу впервые.

binwalk

$ binwalk -R "\xED\x70\x69" dump.sql

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
18            0x12            Raw signature (\xED\x70\x69)

bgrep

Bgrep оказался именно тем тулом, который я искал - простой и очень быстрый.

$ bgrep "ED 70 69" dump.sql
dump.sql: 00000012

Есть поддержка вывода байтов до, после и с обеих сторон от совпадения

$ bgrep -C 10 "ED 70 69" dump.sql
dump.sql: 00000012
sta Club H\xedpico poni

Для тех же кто предпочитает GUI есть вариант просто воспользоваться HEX редактором.

Комментариев нет:

Отправить комментарий