We seriously need the ability to receive NULL's, in the worst case senario could you supply us with some bf_read style function and the ability to get the length so we could assemble the string ourselves for now?

local size = binread:GetSize()
local out = {}
debug.sethook()
while true do
if binread:GetReadPosition() >= size then
break
end
table.insert(out,binread:ReadString())
end
local str = table.concat(out,"\0")
if binread:GetReadPosition() == size then
str = str..string.char(binread:ReadByte())
end

Very fast, but the code isnt very clean

Edited:

When i try to download a zip, 30 bytes is missing (probably file.Write glitchup)