How to loop through character in string and still detect null char in Bash
I have this function:
function convert_ascii_string_to_decimal {
ascii=$1
unset converted_result
while IFS="" read -r -n 1 char; do
decimal=$(printf '%d' "'$char")
echo $decimal
converted_result="$converted_result $decimal"
done < <(printf %s "$ascii")
converted_result=$(echo $converted_result | xargs) #strip leading and trailing
}
It is meant to take an ascii string variable, loop through every character, and concatenate the ascii decimal representation to a string. However, this while loop seems to ignore null chars, ie characters with ascii 0. I want to be able to read every single ascii there is, including null.
bash ascii
add a comment |
I have this function:
function convert_ascii_string_to_decimal {
ascii=$1
unset converted_result
while IFS="" read -r -n 1 char; do
decimal=$(printf '%d' "'$char")
echo $decimal
converted_result="$converted_result $decimal"
done < <(printf %s "$ascii")
converted_result=$(echo $converted_result | xargs) #strip leading and trailing
}
It is meant to take an ascii string variable, loop through every character, and concatenate the ascii decimal representation to a string. However, this while loop seems to ignore null chars, ie characters with ascii 0. I want to be able to read every single ascii there is, including null.
bash ascii
add a comment |
I have this function:
function convert_ascii_string_to_decimal {
ascii=$1
unset converted_result
while IFS="" read -r -n 1 char; do
decimal=$(printf '%d' "'$char")
echo $decimal
converted_result="$converted_result $decimal"
done < <(printf %s "$ascii")
converted_result=$(echo $converted_result | xargs) #strip leading and trailing
}
It is meant to take an ascii string variable, loop through every character, and concatenate the ascii decimal representation to a string. However, this while loop seems to ignore null chars, ie characters with ascii 0. I want to be able to read every single ascii there is, including null.
bash ascii
I have this function:
function convert_ascii_string_to_decimal {
ascii=$1
unset converted_result
while IFS="" read -r -n 1 char; do
decimal=$(printf '%d' "'$char")
echo $decimal
converted_result="$converted_result $decimal"
done < <(printf %s "$ascii")
converted_result=$(echo $converted_result | xargs) #strip leading and trailing
}
It is meant to take an ascii string variable, loop through every character, and concatenate the ascii decimal representation to a string. However, this while loop seems to ignore null chars, ie characters with ascii 0. I want to be able to read every single ascii there is, including null.
bash ascii
bash ascii
asked Nov 13 '18 at 16:18
Daily MemesDaily Memes
112
112
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
To get all characters of a string as decimal number, you can use hexdump
to parse a string:
echo -e "hello x00world" | hexdump -v -e '1/1 "%d "'
104 101 108 108 111 32 0 119 111 114 108 100 10
This also works for parsing a file:
echo '05 04 03 02 01 00 ff' | xxd -r -ps > file
hexdump --no-squeezing --format '1/1 "%d "' file
5 4 3 2 1 0 255
hexdump
explanation:
- options
-v
and--no-squeezing
prints all bytes (without skipping duplicated bytes) - options
-e
and--format
allows giving a specific format - format is
1/1 "%d "
which means
- Iteration count =
1
(process the byte only once) - Byte count =
1
(apply this format for each byte) - Format =
"%d"
(convert to decimal)
- Iteration count =
your first solution gives this error: hexdump: illegal option -- - usage: hexdump [-bcCdovx] [-e fmt] [-f fmt_file] [-n length] [-s skip] [file ...] hd [-bcdovx] [-e fmt] [-f fmt_file] [-n length] [-s skip] [file ...]
– Daily Memes
Nov 13 '18 at 17:10
@DailyMemes I updated the answer with using short (instead of long) option.
– oliv
Nov 13 '18 at 17:35
@olive.. could you pls add explanation
– stack0114106
Nov 14 '18 at 6:50
@stack0114106 What isn't clear exactly?
– oliv
Nov 14 '18 at 7:20
the options -v-e and the format 1/1.. why specifically 1/1
– stack0114106
Nov 14 '18 at 8:44
|
show 3 more comments
You can't store the null character in a bash variable, which is happening in your script with the $char
variable.
I suggest using xxd
instead of writing your own script:
echo -ne "some ascii text" | xxd -p
If we echo a null charcter:
$ echo -ne "" | xxd -p
00
can this be done in decimal intsead of hex?
– Daily Memes
Nov 13 '18 at 17:22
also the problem with this is if there is no stdout, it still reads it as null char. Is it possible to detect whether there was an stdout? or is the lack of stdout represented by null?
– Daily Memes
Nov 13 '18 at 17:29
@DailyMemes I don't understand your question about what happens "if there is no stdout". In that case, I get nothing, not a null. Trycat /dev/null | xxd -p
-- that gives me no output at all. Same with @oliv'shexdump
answer, BTW.
– Gordon Davisson
Nov 13 '18 at 18:36
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53285210%2fhow-to-loop-through-character-in-string-and-still-detect-null-char-in-bash%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
To get all characters of a string as decimal number, you can use hexdump
to parse a string:
echo -e "hello x00world" | hexdump -v -e '1/1 "%d "'
104 101 108 108 111 32 0 119 111 114 108 100 10
This also works for parsing a file:
echo '05 04 03 02 01 00 ff' | xxd -r -ps > file
hexdump --no-squeezing --format '1/1 "%d "' file
5 4 3 2 1 0 255
hexdump
explanation:
- options
-v
and--no-squeezing
prints all bytes (without skipping duplicated bytes) - options
-e
and--format
allows giving a specific format - format is
1/1 "%d "
which means
- Iteration count =
1
(process the byte only once) - Byte count =
1
(apply this format for each byte) - Format =
"%d"
(convert to decimal)
- Iteration count =
your first solution gives this error: hexdump: illegal option -- - usage: hexdump [-bcCdovx] [-e fmt] [-f fmt_file] [-n length] [-s skip] [file ...] hd [-bcdovx] [-e fmt] [-f fmt_file] [-n length] [-s skip] [file ...]
– Daily Memes
Nov 13 '18 at 17:10
@DailyMemes I updated the answer with using short (instead of long) option.
– oliv
Nov 13 '18 at 17:35
@olive.. could you pls add explanation
– stack0114106
Nov 14 '18 at 6:50
@stack0114106 What isn't clear exactly?
– oliv
Nov 14 '18 at 7:20
the options -v-e and the format 1/1.. why specifically 1/1
– stack0114106
Nov 14 '18 at 8:44
|
show 3 more comments
To get all characters of a string as decimal number, you can use hexdump
to parse a string:
echo -e "hello x00world" | hexdump -v -e '1/1 "%d "'
104 101 108 108 111 32 0 119 111 114 108 100 10
This also works for parsing a file:
echo '05 04 03 02 01 00 ff' | xxd -r -ps > file
hexdump --no-squeezing --format '1/1 "%d "' file
5 4 3 2 1 0 255
hexdump
explanation:
- options
-v
and--no-squeezing
prints all bytes (without skipping duplicated bytes) - options
-e
and--format
allows giving a specific format - format is
1/1 "%d "
which means
- Iteration count =
1
(process the byte only once) - Byte count =
1
(apply this format for each byte) - Format =
"%d"
(convert to decimal)
- Iteration count =
your first solution gives this error: hexdump: illegal option -- - usage: hexdump [-bcCdovx] [-e fmt] [-f fmt_file] [-n length] [-s skip] [file ...] hd [-bcdovx] [-e fmt] [-f fmt_file] [-n length] [-s skip] [file ...]
– Daily Memes
Nov 13 '18 at 17:10
@DailyMemes I updated the answer with using short (instead of long) option.
– oliv
Nov 13 '18 at 17:35
@olive.. could you pls add explanation
– stack0114106
Nov 14 '18 at 6:50
@stack0114106 What isn't clear exactly?
– oliv
Nov 14 '18 at 7:20
the options -v-e and the format 1/1.. why specifically 1/1
– stack0114106
Nov 14 '18 at 8:44
|
show 3 more comments
To get all characters of a string as decimal number, you can use hexdump
to parse a string:
echo -e "hello x00world" | hexdump -v -e '1/1 "%d "'
104 101 108 108 111 32 0 119 111 114 108 100 10
This also works for parsing a file:
echo '05 04 03 02 01 00 ff' | xxd -r -ps > file
hexdump --no-squeezing --format '1/1 "%d "' file
5 4 3 2 1 0 255
hexdump
explanation:
- options
-v
and--no-squeezing
prints all bytes (without skipping duplicated bytes) - options
-e
and--format
allows giving a specific format - format is
1/1 "%d "
which means
- Iteration count =
1
(process the byte only once) - Byte count =
1
(apply this format for each byte) - Format =
"%d"
(convert to decimal)
- Iteration count =
To get all characters of a string as decimal number, you can use hexdump
to parse a string:
echo -e "hello x00world" | hexdump -v -e '1/1 "%d "'
104 101 108 108 111 32 0 119 111 114 108 100 10
This also works for parsing a file:
echo '05 04 03 02 01 00 ff' | xxd -r -ps > file
hexdump --no-squeezing --format '1/1 "%d "' file
5 4 3 2 1 0 255
hexdump
explanation:
- options
-v
and--no-squeezing
prints all bytes (without skipping duplicated bytes) - options
-e
and--format
allows giving a specific format - format is
1/1 "%d "
which means
- Iteration count =
1
(process the byte only once) - Byte count =
1
(apply this format for each byte) - Format =
"%d"
(convert to decimal)
- Iteration count =
edited Nov 14 '18 at 8:56
answered Nov 13 '18 at 17:00
olivoliv
8,2911130
8,2911130
your first solution gives this error: hexdump: illegal option -- - usage: hexdump [-bcCdovx] [-e fmt] [-f fmt_file] [-n length] [-s skip] [file ...] hd [-bcdovx] [-e fmt] [-f fmt_file] [-n length] [-s skip] [file ...]
– Daily Memes
Nov 13 '18 at 17:10
@DailyMemes I updated the answer with using short (instead of long) option.
– oliv
Nov 13 '18 at 17:35
@olive.. could you pls add explanation
– stack0114106
Nov 14 '18 at 6:50
@stack0114106 What isn't clear exactly?
– oliv
Nov 14 '18 at 7:20
the options -v-e and the format 1/1.. why specifically 1/1
– stack0114106
Nov 14 '18 at 8:44
|
show 3 more comments
your first solution gives this error: hexdump: illegal option -- - usage: hexdump [-bcCdovx] [-e fmt] [-f fmt_file] [-n length] [-s skip] [file ...] hd [-bcdovx] [-e fmt] [-f fmt_file] [-n length] [-s skip] [file ...]
– Daily Memes
Nov 13 '18 at 17:10
@DailyMemes I updated the answer with using short (instead of long) option.
– oliv
Nov 13 '18 at 17:35
@olive.. could you pls add explanation
– stack0114106
Nov 14 '18 at 6:50
@stack0114106 What isn't clear exactly?
– oliv
Nov 14 '18 at 7:20
the options -v-e and the format 1/1.. why specifically 1/1
– stack0114106
Nov 14 '18 at 8:44
your first solution gives this error: hexdump: illegal option -- - usage: hexdump [-bcCdovx] [-e fmt] [-f fmt_file] [-n length] [-s skip] [file ...] hd [-bcdovx] [-e fmt] [-f fmt_file] [-n length] [-s skip] [file ...]
– Daily Memes
Nov 13 '18 at 17:10
your first solution gives this error: hexdump: illegal option -- - usage: hexdump [-bcCdovx] [-e fmt] [-f fmt_file] [-n length] [-s skip] [file ...] hd [-bcdovx] [-e fmt] [-f fmt_file] [-n length] [-s skip] [file ...]
– Daily Memes
Nov 13 '18 at 17:10
@DailyMemes I updated the answer with using short (instead of long) option.
– oliv
Nov 13 '18 at 17:35
@DailyMemes I updated the answer with using short (instead of long) option.
– oliv
Nov 13 '18 at 17:35
@olive.. could you pls add explanation
– stack0114106
Nov 14 '18 at 6:50
@olive.. could you pls add explanation
– stack0114106
Nov 14 '18 at 6:50
@stack0114106 What isn't clear exactly?
– oliv
Nov 14 '18 at 7:20
@stack0114106 What isn't clear exactly?
– oliv
Nov 14 '18 at 7:20
the options -v-e and the format 1/1.. why specifically 1/1
– stack0114106
Nov 14 '18 at 8:44
the options -v-e and the format 1/1.. why specifically 1/1
– stack0114106
Nov 14 '18 at 8:44
|
show 3 more comments
You can't store the null character in a bash variable, which is happening in your script with the $char
variable.
I suggest using xxd
instead of writing your own script:
echo -ne "some ascii text" | xxd -p
If we echo a null charcter:
$ echo -ne "" | xxd -p
00
can this be done in decimal intsead of hex?
– Daily Memes
Nov 13 '18 at 17:22
also the problem with this is if there is no stdout, it still reads it as null char. Is it possible to detect whether there was an stdout? or is the lack of stdout represented by null?
– Daily Memes
Nov 13 '18 at 17:29
@DailyMemes I don't understand your question about what happens "if there is no stdout". In that case, I get nothing, not a null. Trycat /dev/null | xxd -p
-- that gives me no output at all. Same with @oliv'shexdump
answer, BTW.
– Gordon Davisson
Nov 13 '18 at 18:36
add a comment |
You can't store the null character in a bash variable, which is happening in your script with the $char
variable.
I suggest using xxd
instead of writing your own script:
echo -ne "some ascii text" | xxd -p
If we echo a null charcter:
$ echo -ne "" | xxd -p
00
can this be done in decimal intsead of hex?
– Daily Memes
Nov 13 '18 at 17:22
also the problem with this is if there is no stdout, it still reads it as null char. Is it possible to detect whether there was an stdout? or is the lack of stdout represented by null?
– Daily Memes
Nov 13 '18 at 17:29
@DailyMemes I don't understand your question about what happens "if there is no stdout". In that case, I get nothing, not a null. Trycat /dev/null | xxd -p
-- that gives me no output at all. Same with @oliv'shexdump
answer, BTW.
– Gordon Davisson
Nov 13 '18 at 18:36
add a comment |
You can't store the null character in a bash variable, which is happening in your script with the $char
variable.
I suggest using xxd
instead of writing your own script:
echo -ne "some ascii text" | xxd -p
If we echo a null charcter:
$ echo -ne "" | xxd -p
00
You can't store the null character in a bash variable, which is happening in your script with the $char
variable.
I suggest using xxd
instead of writing your own script:
echo -ne "some ascii text" | xxd -p
If we echo a null charcter:
$ echo -ne "" | xxd -p
00
answered Nov 13 '18 at 16:49
maxmax
360219
360219
can this be done in decimal intsead of hex?
– Daily Memes
Nov 13 '18 at 17:22
also the problem with this is if there is no stdout, it still reads it as null char. Is it possible to detect whether there was an stdout? or is the lack of stdout represented by null?
– Daily Memes
Nov 13 '18 at 17:29
@DailyMemes I don't understand your question about what happens "if there is no stdout". In that case, I get nothing, not a null. Trycat /dev/null | xxd -p
-- that gives me no output at all. Same with @oliv'shexdump
answer, BTW.
– Gordon Davisson
Nov 13 '18 at 18:36
add a comment |
can this be done in decimal intsead of hex?
– Daily Memes
Nov 13 '18 at 17:22
also the problem with this is if there is no stdout, it still reads it as null char. Is it possible to detect whether there was an stdout? or is the lack of stdout represented by null?
– Daily Memes
Nov 13 '18 at 17:29
@DailyMemes I don't understand your question about what happens "if there is no stdout". In that case, I get nothing, not a null. Trycat /dev/null | xxd -p
-- that gives me no output at all. Same with @oliv'shexdump
answer, BTW.
– Gordon Davisson
Nov 13 '18 at 18:36
can this be done in decimal intsead of hex?
– Daily Memes
Nov 13 '18 at 17:22
can this be done in decimal intsead of hex?
– Daily Memes
Nov 13 '18 at 17:22
also the problem with this is if there is no stdout, it still reads it as null char. Is it possible to detect whether there was an stdout? or is the lack of stdout represented by null?
– Daily Memes
Nov 13 '18 at 17:29
also the problem with this is if there is no stdout, it still reads it as null char. Is it possible to detect whether there was an stdout? or is the lack of stdout represented by null?
– Daily Memes
Nov 13 '18 at 17:29
@DailyMemes I don't understand your question about what happens "if there is no stdout". In that case, I get nothing, not a null. Try
cat /dev/null | xxd -p
-- that gives me no output at all. Same with @oliv's hexdump
answer, BTW.– Gordon Davisson
Nov 13 '18 at 18:36
@DailyMemes I don't understand your question about what happens "if there is no stdout". In that case, I get nothing, not a null. Try
cat /dev/null | xxd -p
-- that gives me no output at all. Same with @oliv's hexdump
answer, BTW.– Gordon Davisson
Nov 13 '18 at 18:36
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53285210%2fhow-to-loop-through-character-in-string-and-still-detect-null-char-in-bash%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown