----------------------------------------------------------------------------------
@MSGID: <878r9nxsav.fsf@bsb.me.uk> e8279370
@REPLY:
<8404323f-40c3-473b-a5fd-a37e7af1cb3bn@googlegroups.com> b5d67809
@REPLYADDR Ben Bacarisse <ben.usenet@bsb.me.uk>
@REPLYTO 2:5075/128 Ben Bacarisse
@CHRS: CP866 2
@RFC: 1 0
@RFC-Message-ID: <878r9nxsav.fsf@bsb.me.uk>
@RFC-References:
<8404323f-40c3-473b-a5fd-a37e7af1cb3bn@googlegroups.com>
@TZUTC: 0100
@PID: Gnus/5.13 (Gnus v5.13) Emacs/28.2
(gnu/linux)
@TID: FIDOGATE-5.12-ge4e8b94
"
hongy...@gmail.com" <
hongyi.zhao@gmail.com> writes:
> I want to split a hex string into bytes and compute their xor, as shown below:
>
> werner@X10DAi:~$ data=$( sed `s/\\(..\\)/\\1 /g` <<<
23230DFE4C5336413245313636504135303333333401000A130A1814300A01010101 | sed -e `s/[ ]*$//` )
> werner@X10DAi:~$ IFS=` ` read -ra ADDR <<< "$data"; xor=0; for i
in "${ADDR[@]}"; do xor=$((xor ^ 0x$i)); done; printf `%x
` $xor
> ea
>
> I wonder if there is a more concise and simple method for this
> purpose.
You could construct the expression directly. With only two bytes for
clarity:
printf `%x
` $(($(sed `s/\\(..\\)/0x\\1^/g` <<<2324)0))
The 0 at the end is needed because the sed command adds a trailing ^
operator.
--
Ben.
--- Gnus/5.13 (Gnus v5.13) Emacs/28.2 (gnu/linux)
* Origin: A noiseless patient Spider (2:5075/128)
SEEN-BY: 5001/100 5005/49 5015/255 5019/40 5020/715
848 1042 4441 12000
SEEN-BY: 5030/49 1081 5075/128
@PATH: 5075/128 5020/1042 4441