What's an easy way to convert a string into binary?

Hi!
I’m trying to convert a string into binary, but I’m unsure about how I could do it.
Can someone give me an explanation that is applicable to lua, please?
Thank you!

2 Likes

I’ll assume you want to turn your string into a byte array, its worth noting Lua internally will not represent a number as binary, but this code should work.

local convertStringToByteArray(str)
  local byteArray = {}
  for i = 1, #str do
    local c = string.sub(str, i, i)
    table.insert(byteArray, string.byte(c))
  end
  
  return byteArray
end
1 Like

I don’t want to convert the string into a byte array, I want to convert it into binary.

not going to give you a full script, but I have useful resources for you!

first step is to get each letter using a for loop and getting the ascii code of each character using string.byte

for Character in string.gmatch("Hello", ".") do
    print(string.byte(Character))
end

then you can use this link to find many functions that convert decimal to binary Lua: print integer as a binary - Stack Overflow

function StringToBinary(String)
    local BinaryString = ""

    for Character in string.gmatch(String, ".") do
        BinaryString ..= DecimalToBinary(string.byte(Character)).." "
    end

    return BinaryString:sub(1, -2)
end

print(StringToBinary("Hello"))

DecimalToBinary would be a function you picked from that link, which would convert the ascii code to binary

hopefully this helps!

1 Like

Thanks!
I found an explanation online and wrote a function to convert numbers into binary.

So to convert a text I used gmatch:

for letter in string.gmatch("Hello", ".") do
	local byte = letter:byte(1, 1)
	
	if got then
		got ..= convert(byte) .. " "
	else
		got = convert(byte)
	end
end

print(got) --> 10010001100101 1101100 1101100 1101111

But what it outputs for “Hello” is apparently wrong.

You’ll find this helpful, as it’s able to convert strings to binary using string.format, vice versa.

local function NumberString
(Number)
	local String = ''
	repeat
		local Remainder = Number % 2
		String = Remainder .. String
		Number = (Number - Remainder) / 2
	until Number == 0
	return String
end

-- // Why not convert binary into a string as well? It's a cool trick.
function FromBinary
(String)
	if (#String % 8 ~= 0)
	then
		error('Malformed binary sequence', 2)
	end
	local Result = ''
	for i = 1, (#String), 8 do
		Result = Result..string.char(tonumber(String:sub(i, i + 7), 2))
	end
	return Result
end

local function ToBinary
(String)
	if (#String > 0)
	then
		local Result = ''
		for i = 1, (#String)
		do
			Result  = Result .. string.format('%08d', NumberString(string.byte(string.sub(String, i, i))))
		end
		return Result
	else
		return nil
	end
end

print(FromBinary('011010000110010101101100011011000110111100100000011101110110111101110010011011000110010000100001'))
-- // hello world!

print(ToBinary('Hello world!'))
-- // 011010000110010101101100011011000110111100100000011101110110111101110010011011000110010000100001
4 Likes

as this is completely right, I think @GEILER123456 wanted to space out each character!

2 Likes

Now I only have one problem:
Using what I wrote (What's an easy way to convert a string into binary? - #5 by GEILER123456), I get 10010001100101 1101100 1101100 1101111 from “Hello”, which is apparently wrong.

Thanks, I saw that on github but wanted to write my own version.
There’s one thing left to fix though: What's an easy way to convert a string into binary? - #8 by GEILER123456

This was not on GitHub.
Also, having a space or not does not affect the output.

My code works pretty well and I use it in a few projects already.
You are welcome.

Here’s an example: Paste the binary from my script into this tool:

2 Likes

I managed to fix this by adding a “0” to the beginning of each series.

for letter in string.gmatch("Hello", ".") do
	local byte = letter:byte()

	got ..= "0" .. convert(byte) .. " "
end

Thank you all for the help!

actually nevermind, I realized that some converters add a “0” in the beginning of characters

1 Like