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\n' $xor
ea
I wonder if there is a more concise and simple method for this purpose.
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\n' $xor
ea
I wonder if there is a more concise and simple method for this
purpose.
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\n' $xor
ea
I wonder if there is a more concise and simple method for this purpose.
"[email protected]" <[email protected]> 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\n' $xor
ea
I wonder if there is a more concise and simple method for thisYou could construct the expression directly. With only two bytes for clarity:
purpose.
printf '%x\n' $(($(sed 's/\(..\)/0x\1^/g' <<<2324)0))
The 0 at the end is needed because the sed command adds a trailing ^ operator.
--
Ben.
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\n' $xor
ea
I wonder if there is a more concise and simple method for this purpose.
Regards,
Zhao
On 03.09.2023 08:26, [email protected] wrote:
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\n' $xor
ea
I wonder if there is a more concise and simple method for this purpose.You've already got a couple solutions. So just for completeness here's
a Kornshell solution without a shell loop or external commands
data=...
printf "%2x\n" $((${data//@(??)/0x\1^}0))
(functionally it's a variant of Ben's proposal). Unfortunately it seems
that bash (with extglob set) does not support the \1 in the expression?
Janis
Regards,
Zhao
On Monday, September 4, 2023 at 6:58:04 AM UTC+8, Janis Papanagnou wrote:
On 03.09.2023 08:26, [email protected] wrote:
I want to split a hex string into bytes and compute their xor, as shown below:You've already got a couple solutions. So just for completeness here's
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\n' $xor
ea
I wonder if there is a more concise and simple method for this purpose.
a Kornshell solution without a shell loop or external commands
data=...
printf "%2x\n" $((${data//@(??)/0x\1^}0))
(functionally it's a variant of Ben's proposal). Unfortunately it seems
that bash (with extglob set) does not support the \1 in the expression?
What's your ksh version, and which one should I install for testing your code snippet, as listed below?
werner@X10DAi:~$ ksh
Command 'ksh' not found, but can be installed with:
sudo apt install ksh93u+m # version 1.0.0~beta.2-1, or
sudo apt install mksh # version 59c-16
On 03.09.2023 08:26, [email protected] wrote:
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\n' $xor
ea
I wonder if there is a more concise and simple method for this purpose.
You've already got a couple solutions. So just for completeness here's
a Kornshell solution without a shell loop or external commands
data=...
printf "%2x\n" $((${data//@(??)/0x\1^}0))
(functionally it's a variant of Ben's proposal). Unfortunately it seems
that bash (with extglob set) does not support the \1 in the
expression?
Janis Papanagnou <[email protected]> writes:
On 03.09.2023 08:26, [email protected] wrote:
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\n' $xor
ea
I wonder if there is a more concise and simple method for this purpose.
You've already got a couple solutions. So just for completeness here's
a Kornshell solution without a shell loop or external commands
data=...Much neater.
printf "%2x\n" $((${data//@(??)/0x\1^}0))
(functionally it's a variant of Ben's proposal). Unfortunately it seems that bash (with extglob set) does not support the \1 in theYou can use & but I think it's new:
expression?
printf '0x%X\n' $((${data//??/0x&^}0))
and it can be turned on and off via a variable so not idea in something portable.
--
Ben.
On Monday, September 4, 2023 at 10:39:52 AM UTC+8, Ben Bacarisse wrote:
Janis Papanagnou <[email protected]> writes:
On 03.09.2023 08:26, [email protected] wrote:Much neater.
I want to split a hex string into bytes and compute their xor, as shown below:You've already got a couple solutions. So just for completeness here's
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\n' $xor
ea
I wonder if there is a more concise and simple method for this purpose. >> >
a Kornshell solution without a shell loop or external commands
data=...
printf "%2x\n" $((${data//@(??)/0x\1^}0))
(functionally it's a variant of Ben's proposal). Unfortunately it seems
that bash (with extglob set) does not support the \1 in the
expression?
You can use & but I think it's new:
printf '0x%X\n' $((${data//??/0x&^}0))
I tried to understand the above code snippet with the help of
chatgpt-4 as follows:
### begin quote ###
data=...
printf '0x%X\n' $((${data//??/0x&^}0))
explain the above ksh code.
The provided script line is an example of shell arithmetic expansion and parameter substitution in KornShell (ksh).
The code does the following:
1. `data=...`: This defines a variable `data`. It's supposed to have some hex value. The value isn't assigned in your example; it's merely given as ellipsis `...`.
2. `printf '0x%X\n' $((${data//??/0x&^}0))`: This is a more complex part.
- `printf '0x%X\n'`: This is a printf command that prints a number in hexadecimal format ('0x' at the beginning). The `%X` is a format specification for the hexadecimal output.
- `${data//??/0x&^}0`: This is a pattern substitution with arithmetic expansion.
- `${data//??/0x&}`: This will replace every two consecutive characters (`??`) in `data` with `0x&` (where `&` represents the matched part). So, if `data` was `1234`, after this operation it would become `0x120x34`.
- `${data//??/0x&^}0`: The `^` is bitwise XOR in ksh. It's used to XOR all the hexadecimal numbers together. The trailing `0` is necessary as the first XOR operation is between the `0` and the first replaced value.
The whole command is useful in converting multiple byte ASCII values into one big endian hexadecimal value. It opens up the byte string, calculates the XOR of all bytes, and prints out the final value in hexadecimal format.
### end quote ###
But I'm not sure if the above explanation is completely correct.
"[email protected]" <[email protected]> writes:
On Monday, September 4, 2023 at 10:39:52 AM UTC+8, Ben Bacarisse wrote:Note that Janis is talking about bash now...
Janis Papanagnou <[email protected]> writes:
On 03.09.2023 08:26, [email protected] wrote:Much neater.
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\n' $xor
ea
I wonder if there is a more concise and simple method for this purpose.
You've already got a couple solutions. So just for completeness here's >> > a Kornshell solution without a shell loop or external commands
data=...
printf "%2x\n" $((${data//@(??)/0x\1^}0))
(functionally it's a variant of Ben's proposal). Unfortunately it seems >> > that bash (with extglob set) does not support the \1 in the
expression?
You can use & but I think it's new:
printf '0x%X\n' $((${data//??/0x&^}0))
I tried to understand the above code snippet with the help of
chatgpt-4 as follows:
### begin quote ###
data=...
printf '0x%X\n' $((${data//??/0x&^}0))
explain the above ksh code.It's not ksh code (or not intended to be at last).
The provided script line is an example of shell arithmetic expansion and parameter substitution in KornShell (ksh).
The code does the following:
1. `data=...`: This defines a variable `data`. It's supposed to have some hex value. The value isn't assigned in your example; it's merely given as ellipsis `...`.
2. `printf '0x%X\n' $((${data//??/0x&^}0))`: This is a more complex part.
- `printf '0x%X\n'`: This is a printf command that prints a number in hexadecimal format ('0x' at the beginning). The `%X` is a format specification for the hexadecimal output.
- `${data//??/0x&^}0`: This is a pattern substitution with arithmetic expansion.
- `${data//??/0x&}`: This will replace every two consecutive characters (`??`) in `data` with `0x&` (where `&` represents the matched part). So, if `data` was `1234`, after this operation it would become `0x120x34`.
- `${data//??/0x&^}0`: The `^` is bitwise XOR in ksh. It's used to XOR all the hexadecimal numbers together. The trailing `0` is necessary as the first XOR operation is between the `0` and the first replaced value.
The whole command is useful in converting multiple byte ASCII values into one big endian hexadecimal value. It opens up the byte string, calculates the XOR of all bytes, and prints out the final value in hexadecimal format.
### end quote ###
But I'm not sure if the above explanation is completely correct.Nor me. Why use something like ChatGPT that needs checking? Why not
check it yourself from the bash manual? Or you could ask the group to explain it if there's some bit you don't follow.
--
Ben.
I tried to test the above code snippet as follows:^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0")
werner@X10DAi:~$ echo $SHELL
/bin/bash
werner@X10DAi:~$ data=23230DFE4C5336413245313636504135303333333401000A130A1814300A01010101
werner@X10DAi:~$ printf '0x%X\n' $((${data//??/0x&^}0))
bash: 0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0: syntax error: operand expected (error token is "^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&^0x&
werner@X10DAi:~$ printf '0x%X\n' $((${data//??/0x\1^}0))
| Sysop: | Keyop |
|---|---|
| Location: | Huddersfield, West Yorkshire, UK |
| Users: | 715 |
| Nodes: | 16 (2 / 14) |
| Uptime: | 151:13:23 |
| Calls: | 12,091 |
| Calls today: | 4 |
| Files: | 15,000 |
| Messages: | 6,517,604 |