我生成了一个随机字符串,可以说使用此randstring(RandomDevice(), 'a':'z', 15)
,现在我希望将其输出作为字节字符串。我该怎么办?
更多上下文:我想做的是编写类似于python的os.urandom()函数的东西。
答案 0 :(得分:2)
Julia似乎至少在Base
中没有像 bytestrings 这样的Python。
julia> using Random
julia> using Random: RandomDevice, randstring
julia> rs = randstring(RandomDevice(), 'a':'z', 15)
"wbfgxgoheksvxvx"
您可以使用codeunits
函数获取代码单元包装器,该函数返回Base.CodeUnits
的向量:
julia> cu = codeunits(rs)
15-element CodeUnits{UInt8,String}:
0x77
0x62
0x66
0x67
0x78
0x67
0x6f
0x68
0x65
0x6b
0x73
0x76
0x78
0x76
0x78
或使用b""
非标准字符串文字宏:
julia> b"wbfgxgoheksvxvx"
15-element CodeUnits{UInt8,String}:
0x77
0x62
0x66
0x67
0x78
0x67
0x6f
0x68
0x65
0x6b
0x73
0x76
0x78
0x76
0x78
您可以拥有这样的字节数组:
julia> ba = Vector{UInt8}(rs)
15-element Array{UInt8,1}:
0x77
0x62
0x66
0x67
0x78
0x67
0x6f
0x68
0x65
0x6b
0x73
0x76
0x78
0x76
0x78
您可以使用repr
函数以及split
和join
函数来创建所需的字符串:
julia> function bytestring(s::String)::String
ba = Vector{UInt8}(s)
return join([join(("\\x", split(repr(cu), "x")[2]), "") for cu in ba], "")
end
bytestring (generic function with 1 method)
julia> bytestring(rs)
"\\x77\\x62\\x66\\x67\\x78\\x67\\x6f\\x68\\x65\\x6b\\x73\\x76\\x78\\x76\\x78"
您可以将其放在宏中以创建自定义的非标准字符串文字:
julia> macro bs_str(s)
return bytestring(s)
end
@bs_str (macro with 1 method)
julia> bs"wbfgxgoheksvxvx"
"\\x77\\x62\\x66\\x67\\x78\\x67\\x6f\\x68\\x65\\x6b\\x73\\x76\\x78\\x76\\x78"
最后,您可以这样编写:
julia> urandom(r::Random.AbstractRNG, chars, n::Integer)::String = bytestring(randstring(r, chars, n))
urandom (generic function with 1 method)
julia> urandom(RandomDevice(), 'a':'z', 15)
"\\x67\\x61\\x78\\x64\\x71\\x68\\x73\\x77\\x76\\x6e\\x6d\\x6d\\x63\\x78\\x68"