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, есть какой-то способ сделать это на несколько порядков быстрее, только я его пока не вижу :)



