# String to Binary

This is a code golf challenge. Just like the title says, write a program to covert a string of ascii characters into binary.

For example:

"Hello World!" should turn into 1001000 1100101 1101100 1101100 1101111 100000 1010111 1101111 1110010 1101100 1100100 100001.

Note: I am particularly interested in a pyth implementation.

• We had the reversed asked: codegolf.stackexchange.com/questions/35096/… – hmatt1 Jan 23 '15 at 0:57
• I noticed that. There's an anecdote for why I asked this question. I encouraged my friend to learn programming, and he took a java class last summer where each student had to pick a project. He told me he wanted to translate text to binary, which I then did (to his dismay) in python 3 in 1 line (a very long line). I find it incredible that his project idea can be distilled down to 8 bytes. – ericmarkmartin Jan 23 '15 at 4:12
• that's cool, thanks for sharing! I do like easier questions like this because it gives more people a chance to participate and generates lots of content in the form of answers. – hmatt1 Jan 23 '15 at 4:22
• Does it has to be ASCII? i.e., if a technology is not ASCII compatible, could the results reflect that? – Shaun Bebbers Apr 13 '19 at 11:13
• Is it acceptable to output with a separator other than spaces (e.g. a newline)? – caird coinheringaahing Sep 3 '19 at 9:51

## STATA 158

I used a different approach than most. Read in via the display _request() prompt (shortened to di _r(r)). Write the string to a file called b in text mode. Open b in binary mode and read each character as a byte and convert to binary. Technically the b file should be closed at the end, but it is a valid program and runs successfully without it.

di _r(r)
file open a using "b",w
file w a "$r" file close a file open a using "b",b r file r a %1bu t while r(eof)==0 { loc q=t inbase 2 q' file r a %1bu t }  # Golang - 68 I'm new to Go and I'm not sure on the rules for counting characters in this language on here either. Imports (11 bytes): import"fmt"  Function (55 bytes): func c(s string){for _,r:=range s{fmt.Printf("%b ",r)}}  You can run it here. • You can golf this with import."fmt" and then just using Printf. – S.S. Anne Feb 21 at 23:56 Never will C# win these kinds of questions but here's a try, completely without encoding. :) # C# - 84 Console.Write(String.Join(" ",Console.ReadLine().Select(x=>Convert.ToString(x,2))));  • This could be made much shorter by using a lambda function, ie: x=>String.Join(" ",x.Select(y=>Convert.ToString(y,2))); However note that, due to using .Select(), both this shorter answer, and your original answer, need to include the 18 bytes for using System.Linq; unless you specify that it's using the Visual C# Interactive Compiler, which imports System.Linq by default – Skidsdev Apr 15 '19 at 15:09 • Here's the lambda function solution using Interactive Compiler, total of 55 bytes – Skidsdev Apr 15 '19 at 15:10 # Cobra - 64 As a Lambda: do(s='')=(for c as int in s get Convert.toString(c,2)).join(' ')  # Postscript, 17 bytes (13 byte program + 4 character command line switch) s { 2 7 string cvrs = } forall  Which is 31 bytes in tokenized form: (backticks denote literal characters, everything else is hexidecimal) s{2 7 92A5 9230 =} 9249  Run using Ghostscript as: gs -ss="Hello World!" string-to-binary.ps  # JavaScript 78 alert(eval('""'+prompt().replace(/./g,"+' '+'$&'.charCodeAt().toString(2)")))


# Ruby 38 Bytes

p gets.bytes.map{|i|i.to_s 2}.join ' '

• .join ' ' can be shortened to *' '. – Martin Ender Jan 23 '15 at 22:59

# Erlang, 71 Bytes

f(S)->L=lists,L:droplast(L:flatten([integer_to_list(X,2)++" "||X<-S])).


If a trailing whitespace at the end is allowed then

# 55 Bytes

f(S)->lists:flatten([integer_to_list(X,2)++" "||X<-S]).


# Julia, 23 bytes

f(n)=[bin(a)for a in n]


# q/kdb+, 18 bytes

Solution:

" "sv"01"0b vs'4h$ Example: q)" "sv"01"0b vs'4h$"Hello World!"
"01001000 01100101 01101100 01101100 01101111 00100000 01010111 01101111 01110010 01101100 01100100 00100001"


Explanation:

Convert string to byte array, convert each byte to binary, index into the string "01" and then join strings together with whitespace " ":

" "sv"01"0b vs'4h$/ the solution 4h$ / cast ($) to type byte (4h) 0b vs' / convert each (') byte to binary (0b vs) "01" / (implicit) index into "01" (false;true) " "sv / join (sv) with " "  # Shell utils, 102 bytes I'm kind of ashamed of this. xxd -b|sed -r "s/^.*: //;s/ .+$//;s/0*([01]+)/\1/g"|tr \n\r " "|sed -r "s/ +/ /g;s/ *1101 *1010 *$//"  Since I'm (possibly) running utilities from various archives across the Internet on Windows, I'll list the version information for each: xxd V1.10 27oct98 by Juergen Weigert GNU sed version 4.2.1 tr (GNU textutils) 2.0 Microsoft Windows [Version 10.0.15063]  # PHP, 59 bytes <?foreach(str_split($argv[1])as$a)echo decbin(ord($a)).' ';


Try it online!

# Deorst, 8 bytes

vombkE]_


Try it online!

## How it works

Example input: ab

vo       - Map ordinal;      STACK = [[97, 98]]
mb     - Map binary;       STACK = [['1100001', '1100010']]
k    - Turn off sort;    STACK = [['1100001', '1100010']]
E]  - Flatten;          STACK = ['110001', '1100010']
_ - Join with spaces; STACK = ['110001 1100010']


# Java 8, 112 bytes

Takes input as a command line argument

interface M{static void main(String[]a){a[0].chars().forEach(i->System.out.print(Long.toBinaryString(i)+" "));}}


Try it online!

• I'm so tired right now that I forgot I already did this challenge and almost posted a duplicate. – Benjamin Urquhart Apr 16 '19 at 12:32

# Perl 5, 21 bytes

printf'%b ',ord for@F


Try it online!

# Perl 6, 16 bytes

*.ords>>.base(2)


Try it online!

Converts the string to codepoints and then each to base 2.

# 05AB1E, 10 bytes

SvyÇ2Bнð«?

S           //Split string
v          //Loop on every character
y         //Push current character to the stack
Ç        //Get ASCII value of character
2B      //Convert to base 2
н     //Convert from 1-element array to string
ð«   //Append space
?  //Print with no newline


Try it online!

# Zsh, 43 bytes

for c (${(s::)1})printf${$(([#2]#c))#??}\  for c (${(s::)1})                             # for character in string $1 (e.g. H)$((      ))          # arithmetic evaluation
$(( #c)) # get character code (e.g. 72)$(([#2]#c))          # convert to base 2            (e.g. 2#1001000)
${ #??} # strip leading two characters (e.g. 1001000) printf${              }\    # append space, print


If all binary strings need to be 8 characters long, +9 bytes:

for c (${(s::)1})printf${(l:8::0:)$(([#2]#c))#??}\  Try it online! • using printf for 43 bytes – roblogic Sep 3 '19 at 0:23 # Python 3, 39 bytes for i in input():print(bin(ord(i))[2:])  Try it online! • Welcome to the site! While I'm sure it's a non-issue, the post asks for spaces, not newlines, between the binary chunks. I've commented on the question asking if newlines are acceptable for you. In addition, I've edited in a link to Try it online! so that others can verify that your solution works. – caird coinheringaahing Sep 3 '19 at 9:51 # Japt-S, 4 bytes ¬®c¤  Try it ¬®c¤ :Implicit input input of string U ¬ :Split ® :Map c : Character code ¤ : To binary string :Implicitly join with spaces and output  Or, if we can take input as an array of characters ... ## Japt-mS, 2 bytes c¤  Try it # Erlang 41 [io:fwrite('~.2B ',[C])||C<-io:read("")].  • How is this answer called? Is it a complete program? Is it a function? Is it something else? – Ad Hoc Garf Hunter Sep 3 '19 at 18:35 • Fixed to be full program. – Hauleth Sep 4 '19 at 16:57 # Elixir 47 for c<-:io.read(''),do: :io.fwrite('~.2B ',[c])  As function: & for<<c<-&1>>,do: :io.fwrite('~.2B ',[c])  As function working on charlists (' delimited strings): & for c<-&1,do: :io.fwrite('~.2B ',[c])  # Burlesque, 10 bytes XX{**b2}mw  Try it online! XX # Break into characters { ** # Convert to ascii val b2 # Convert to binary }mw # Map and spaces between elements  # PHP, 44 bytes while($c=decbin(ord($argn[$i++])))echo"\$c ";
`

Try it online!