Extremely new to Julia.  My background is in Python and C. 
Working on implementing the Matasano crypto challenges in Julia to learn 
the ins and outs.  The implementations require heavy use of string 
conversions, casting, and byte comparisons.

Since Julia's built-in ascii() barfs on any byte that can't be represented 
in ASCII, it became useful to define a function that filters out all such 
bytes from a byte vector.

function ascii_filter(s::Array{Uint8})
  if is_valid_ascii(s)
    return s
  end
  filter!(x -> is_valid_ascii([x]), s)
  @assert is_valid_ascii(s)
  s = ascii(s)
  @assert isa(s, ASCIIString)                                       <-- 
assertion OK
  return s
end



The fact that is_valid_ascii() only has a method for vectors of bytes, and 
not a single byte, is a minor annoyance that is worked around by an 
anonymous function that wraps a Uint8 as a Vector{Uint8} of length 1.
However, I cannot seem to make this return a variable of type ASCIIString, 
which is necessary for later use with uppercase(), etc.  

function detect_xor_encryption(cipher_text::Array{Uint8}, keys::Vector, 
threshold::Int = 50)
 {...}
    clear_text = ascii_filter(repeating_xor(cipher_text, key))
    @assert isa(clear_text, ASCIIString)                            <-- 
assertion fails
    s = score_candidate_language(clear_text, "english")
{...}



function score_candidate_language(test_str::ASCIIString, language::String)
{...}



At the time of assignment to clear_text, it seems the return value of 
ascii_filter() has fallen back to Array{Uint8}.  No amount of monkeying 
around in ascii_filter() could solve the problem.  I tried defining 
s::ASCIIString, and explicitly returning ascii(s) after the assert.  It 
seems that no matter what I do, I have to explicitly define the type of a 
variable as ::ASCIIString or wrap ascii() in the *calling function* every 
time I want to use ascii_filter() to build an ASCIIString and pass it to a 
function that takes an ASCIIString as an argument.

Is this intended?  Am I missing something obvious?

Reply via email to