How to read 8 bit ascii from terminal in linux
I'm running ubuntu 16, and am using a bash script in the terminal that reads the stdout of a program. The c++ program uses putchar to output 8 bit characters to the terminal through stdout. I try to capture that output in the bash script and print the ascii decimal representation.
For example, if the program outputs 'A', the bash script would convert and print 65 as the corresponding ascii. However, when the program outputs a weird character outside the 0-127 range, all I get is 32767 instead of the correct decimal. It seems that bash on ubuntu is not capable of non standard 8 bit ascii.
I currently use something like this to convert to decimal:
decimal=$(printf '%d' "'$char")
Is there any way I can convert the character from stdout to a decimal value on the linux command line?
bash ubuntu ascii
add a comment |
I'm running ubuntu 16, and am using a bash script in the terminal that reads the stdout of a program. The c++ program uses putchar to output 8 bit characters to the terminal through stdout. I try to capture that output in the bash script and print the ascii decimal representation.
For example, if the program outputs 'A', the bash script would convert and print 65 as the corresponding ascii. However, when the program outputs a weird character outside the 0-127 range, all I get is 32767 instead of the correct decimal. It seems that bash on ubuntu is not capable of non standard 8 bit ascii.
I currently use something like this to convert to decimal:
decimal=$(printf '%d' "'$char")
Is there any way I can convert the character from stdout to a decimal value on the linux command line?
bash ubuntu ascii
There's no such thing as "8 bit ASCII" -- ASCII is a 7-bit code. There are various 8-bit character encodings that include ASCII as codes 0-127 (such as iso8859 and UTF-8) -- maybe you mean one of them?
– Chris Dodd
Nov 19 '18 at 5:21
add a comment |
I'm running ubuntu 16, and am using a bash script in the terminal that reads the stdout of a program. The c++ program uses putchar to output 8 bit characters to the terminal through stdout. I try to capture that output in the bash script and print the ascii decimal representation.
For example, if the program outputs 'A', the bash script would convert and print 65 as the corresponding ascii. However, when the program outputs a weird character outside the 0-127 range, all I get is 32767 instead of the correct decimal. It seems that bash on ubuntu is not capable of non standard 8 bit ascii.
I currently use something like this to convert to decimal:
decimal=$(printf '%d' "'$char")
Is there any way I can convert the character from stdout to a decimal value on the linux command line?
bash ubuntu ascii
I'm running ubuntu 16, and am using a bash script in the terminal that reads the stdout of a program. The c++ program uses putchar to output 8 bit characters to the terminal through stdout. I try to capture that output in the bash script and print the ascii decimal representation.
For example, if the program outputs 'A', the bash script would convert and print 65 as the corresponding ascii. However, when the program outputs a weird character outside the 0-127 range, all I get is 32767 instead of the correct decimal. It seems that bash on ubuntu is not capable of non standard 8 bit ascii.
I currently use something like this to convert to decimal:
decimal=$(printf '%d' "'$char")
Is there any way I can convert the character from stdout to a decimal value on the linux command line?
bash ubuntu ascii
bash ubuntu ascii
asked Nov 19 '18 at 3:40
Daily MemesDaily Memes
112
112
There's no such thing as "8 bit ASCII" -- ASCII is a 7-bit code. There are various 8-bit character encodings that include ASCII as codes 0-127 (such as iso8859 and UTF-8) -- maybe you mean one of them?
– Chris Dodd
Nov 19 '18 at 5:21
add a comment |
There's no such thing as "8 bit ASCII" -- ASCII is a 7-bit code. There are various 8-bit character encodings that include ASCII as codes 0-127 (such as iso8859 and UTF-8) -- maybe you mean one of them?
– Chris Dodd
Nov 19 '18 at 5:21
There's no such thing as "8 bit ASCII" -- ASCII is a 7-bit code. There are various 8-bit character encodings that include ASCII as codes 0-127 (such as iso8859 and UTF-8) -- maybe you mean one of them?
– Chris Dodd
Nov 19 '18 at 5:21
There's no such thing as "8 bit ASCII" -- ASCII is a 7-bit code. There are various 8-bit character encodings that include ASCII as codes 0-127 (such as iso8859 and UTF-8) -- maybe you mean one of them?
– Chris Dodd
Nov 19 '18 at 5:21
add a comment |
1 Answer
1
active
oldest
votes
Try xxd -p
instead.
For instance,
char=$'xff'
decimal=$(( 16#$(printf "%c" "$char" | xxd -p) ))
echo "$decimal"
yields:
255
Here's the test script for the characters between 0 and 255:
#!/bin/bash
for ((i=0; i<256; i++)); do
hex=$(printf "%x" $i)
char=$(printf "x${hex}")
if [[ "$i" -eq 10 ]]; then
char=$'n'
fi
# The if statement above is a workaround to generate the test sequence
# properly because $( ... ) chops of the trailing newline
# and is not essential for the conversion code below
decimal=$(( 16#$(printf "%c" "$char" | xxd -p) ))
echo "$i => $decimal"
done
Explanation:
printf "%c" "$char" | xxd -p
returns hex string,ff
in this case.
$(( 16#hexval ))
converts the hexadecimal value to decimal.
although I'd recommend to use other language like python
or perl
for flexibility and efficiency. Here's the perl version:
decimal=$(printf "%c" "$char" | perl -ne 'print unpack("%C", $_)' )
Thanks for the workaround!
– Daily Memes
Nov 19 '18 at 15:51
this is better, but still some numbers are getting messed up. 205 gets changed to 52583 but 243 and 255 work fine for example...
– Daily Memes
Nov 19 '18 at 16:36
Sorry for my mistake. I should have examined my code with whole characters from 0 to 255. I found some mistranslations with tab, newline, whitespace etc., although I could not reproduce the output 52583 for input 205. I've corrected my answer and added a perl solution just in case. BR.
– tshiono
Nov 20 '18 at 1:47
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%2f53368003%2fhow-to-read-8-bit-ascii-from-terminal-in-linux%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
Try xxd -p
instead.
For instance,
char=$'xff'
decimal=$(( 16#$(printf "%c" "$char" | xxd -p) ))
echo "$decimal"
yields:
255
Here's the test script for the characters between 0 and 255:
#!/bin/bash
for ((i=0; i<256; i++)); do
hex=$(printf "%x" $i)
char=$(printf "x${hex}")
if [[ "$i" -eq 10 ]]; then
char=$'n'
fi
# The if statement above is a workaround to generate the test sequence
# properly because $( ... ) chops of the trailing newline
# and is not essential for the conversion code below
decimal=$(( 16#$(printf "%c" "$char" | xxd -p) ))
echo "$i => $decimal"
done
Explanation:
printf "%c" "$char" | xxd -p
returns hex string,ff
in this case.
$(( 16#hexval ))
converts the hexadecimal value to decimal.
although I'd recommend to use other language like python
or perl
for flexibility and efficiency. Here's the perl version:
decimal=$(printf "%c" "$char" | perl -ne 'print unpack("%C", $_)' )
Thanks for the workaround!
– Daily Memes
Nov 19 '18 at 15:51
this is better, but still some numbers are getting messed up. 205 gets changed to 52583 but 243 and 255 work fine for example...
– Daily Memes
Nov 19 '18 at 16:36
Sorry for my mistake. I should have examined my code with whole characters from 0 to 255. I found some mistranslations with tab, newline, whitespace etc., although I could not reproduce the output 52583 for input 205. I've corrected my answer and added a perl solution just in case. BR.
– tshiono
Nov 20 '18 at 1:47
add a comment |
Try xxd -p
instead.
For instance,
char=$'xff'
decimal=$(( 16#$(printf "%c" "$char" | xxd -p) ))
echo "$decimal"
yields:
255
Here's the test script for the characters between 0 and 255:
#!/bin/bash
for ((i=0; i<256; i++)); do
hex=$(printf "%x" $i)
char=$(printf "x${hex}")
if [[ "$i" -eq 10 ]]; then
char=$'n'
fi
# The if statement above is a workaround to generate the test sequence
# properly because $( ... ) chops of the trailing newline
# and is not essential for the conversion code below
decimal=$(( 16#$(printf "%c" "$char" | xxd -p) ))
echo "$i => $decimal"
done
Explanation:
printf "%c" "$char" | xxd -p
returns hex string,ff
in this case.
$(( 16#hexval ))
converts the hexadecimal value to decimal.
although I'd recommend to use other language like python
or perl
for flexibility and efficiency. Here's the perl version:
decimal=$(printf "%c" "$char" | perl -ne 'print unpack("%C", $_)' )
Thanks for the workaround!
– Daily Memes
Nov 19 '18 at 15:51
this is better, but still some numbers are getting messed up. 205 gets changed to 52583 but 243 and 255 work fine for example...
– Daily Memes
Nov 19 '18 at 16:36
Sorry for my mistake. I should have examined my code with whole characters from 0 to 255. I found some mistranslations with tab, newline, whitespace etc., although I could not reproduce the output 52583 for input 205. I've corrected my answer and added a perl solution just in case. BR.
– tshiono
Nov 20 '18 at 1:47
add a comment |
Try xxd -p
instead.
For instance,
char=$'xff'
decimal=$(( 16#$(printf "%c" "$char" | xxd -p) ))
echo "$decimal"
yields:
255
Here's the test script for the characters between 0 and 255:
#!/bin/bash
for ((i=0; i<256; i++)); do
hex=$(printf "%x" $i)
char=$(printf "x${hex}")
if [[ "$i" -eq 10 ]]; then
char=$'n'
fi
# The if statement above is a workaround to generate the test sequence
# properly because $( ... ) chops of the trailing newline
# and is not essential for the conversion code below
decimal=$(( 16#$(printf "%c" "$char" | xxd -p) ))
echo "$i => $decimal"
done
Explanation:
printf "%c" "$char" | xxd -p
returns hex string,ff
in this case.
$(( 16#hexval ))
converts the hexadecimal value to decimal.
although I'd recommend to use other language like python
or perl
for flexibility and efficiency. Here's the perl version:
decimal=$(printf "%c" "$char" | perl -ne 'print unpack("%C", $_)' )
Try xxd -p
instead.
For instance,
char=$'xff'
decimal=$(( 16#$(printf "%c" "$char" | xxd -p) ))
echo "$decimal"
yields:
255
Here's the test script for the characters between 0 and 255:
#!/bin/bash
for ((i=0; i<256; i++)); do
hex=$(printf "%x" $i)
char=$(printf "x${hex}")
if [[ "$i" -eq 10 ]]; then
char=$'n'
fi
# The if statement above is a workaround to generate the test sequence
# properly because $( ... ) chops of the trailing newline
# and is not essential for the conversion code below
decimal=$(( 16#$(printf "%c" "$char" | xxd -p) ))
echo "$i => $decimal"
done
Explanation:
printf "%c" "$char" | xxd -p
returns hex string,ff
in this case.
$(( 16#hexval ))
converts the hexadecimal value to decimal.
although I'd recommend to use other language like python
or perl
for flexibility and efficiency. Here's the perl version:
decimal=$(printf "%c" "$char" | perl -ne 'print unpack("%C", $_)' )
edited Nov 20 '18 at 1:46
answered Nov 19 '18 at 4:56
tshionotshiono
2,551236
2,551236
Thanks for the workaround!
– Daily Memes
Nov 19 '18 at 15:51
this is better, but still some numbers are getting messed up. 205 gets changed to 52583 but 243 and 255 work fine for example...
– Daily Memes
Nov 19 '18 at 16:36
Sorry for my mistake. I should have examined my code with whole characters from 0 to 255. I found some mistranslations with tab, newline, whitespace etc., although I could not reproduce the output 52583 for input 205. I've corrected my answer and added a perl solution just in case. BR.
– tshiono
Nov 20 '18 at 1:47
add a comment |
Thanks for the workaround!
– Daily Memes
Nov 19 '18 at 15:51
this is better, but still some numbers are getting messed up. 205 gets changed to 52583 but 243 and 255 work fine for example...
– Daily Memes
Nov 19 '18 at 16:36
Sorry for my mistake. I should have examined my code with whole characters from 0 to 255. I found some mistranslations with tab, newline, whitespace etc., although I could not reproduce the output 52583 for input 205. I've corrected my answer and added a perl solution just in case. BR.
– tshiono
Nov 20 '18 at 1:47
Thanks for the workaround!
– Daily Memes
Nov 19 '18 at 15:51
Thanks for the workaround!
– Daily Memes
Nov 19 '18 at 15:51
this is better, but still some numbers are getting messed up. 205 gets changed to 52583 but 243 and 255 work fine for example...
– Daily Memes
Nov 19 '18 at 16:36
this is better, but still some numbers are getting messed up. 205 gets changed to 52583 but 243 and 255 work fine for example...
– Daily Memes
Nov 19 '18 at 16:36
Sorry for my mistake. I should have examined my code with whole characters from 0 to 255. I found some mistranslations with tab, newline, whitespace etc., although I could not reproduce the output 52583 for input 205. I've corrected my answer and added a perl solution just in case. BR.
– tshiono
Nov 20 '18 at 1:47
Sorry for my mistake. I should have examined my code with whole characters from 0 to 255. I found some mistranslations with tab, newline, whitespace etc., although I could not reproduce the output 52583 for input 205. I've corrected my answer and added a perl solution just in case. BR.
– tshiono
Nov 20 '18 at 1:47
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%2f53368003%2fhow-to-read-8-bit-ascii-from-terminal-in-linux%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
There's no such thing as "8 bit ASCII" -- ASCII is a 7-bit code. There are various 8-bit character encodings that include ASCII as codes 0-127 (such as iso8859 and UTF-8) -- maybe you mean one of them?
– Chris Dodd
Nov 19 '18 at 5:21