XOR-сумма - это результат последовательного XOR всех байт строки, один из самых примитивных, если не самый примитивный, методов контроля целостности.
Применительно к NMEA 0183, где это как раз используется, я реализовал алгоритм так (см. функцию проверки validateS):
ord() { LC_CTYPE=C printf '%d' «'$1» } validateS () { local S=«$@» lS local i origXSum myXSum [[ $S =~ ^\$.+\*[0-9A-F]{2}$ ]] || return 1 lS=${#S} origXSum=${S:$((lS-2)):2} S=${S:1:$((lS-4))} myXSum=0 for ((i=0; i<${#S}; i++)); do (( myXSum^=$(ord ${S:$i:1}) )) done [[ $(printf '%.2X\n' $myXSum) == $origXSum ]] || return 2 [[ ${S:1:5} == 'GPRMC' && $S =~ ',V,' ]] && return 3 return 0 }В NMEA 0183 строка начинается с $, а заканчивается *XORSUM, где XORSUM - это hex-представление (2 символа то бишь) одного байта XOR-суммы всех байт между $ и *.
Собственно, вопрос о том, можно ли реализовать это быстрее? Есть, например, вариант сразу преобразовывать строку полностью к hex-виду, и уже после этого считать XOR-сумму, не вызывая каждый раз ord(). Но, полагаю, как это часто бывает в BASH, есть какой-то способ сделать это на несколько порядков быстрее, только я его пока не вижу :)