How to read 8 bit ascii from terminal in linux












0















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?










share|improve this question























  • 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
















0















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?










share|improve this question























  • 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














0












0








0








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?










share|improve this question














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






share|improve this question













share|improve this question











share|improve this question




share|improve this question










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



















  • 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












1 Answer
1






active

oldest

votes


















1














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", $_)' )





share|improve this answer


























  • 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











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
});


}
});














draft saved

draft discarded


















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









1














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", $_)' )





share|improve this answer


























  • 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
















1














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", $_)' )





share|improve this answer


























  • 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














1












1








1







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", $_)' )





share|improve this answer















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", $_)' )






share|improve this answer














share|improve this answer



share|improve this answer








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



















  • 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




















draft saved

draft discarded




















































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.




draft saved


draft discarded














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





















































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







Popular posts from this blog

Guess what letter conforming each word

Port of Spain

Run scheduled task as local user group (not BUILTIN)