如何将随机字符串转换为字节字符串

时间:2019-07-15 16:53:49

标签: julia

我生成了一个随机字符串,可以说使用此randstring(RandomDevice(), 'a':'z', 15),现在我希望将其输出作为字节字符串。我该怎么办?

更多上下文:我想做的是编写类似于python的os.urandom()函数的东西。

1 个答案:

答案 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函数以及splitjoin函数来创建所需的字符串:

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"