Skip to content

Commit

Permalink
Merge pull request #2 from oprypin/random_bytes
Browse files Browse the repository at this point in the history
Reimplement random_bytes to be consistent with endianness
  • Loading branch information
ysbaddaden authored Sep 4, 2017
2 parents af8393f + a9e8c7f commit bc7611e
Showing 1 changed file with 10 additions and 12 deletions.
22 changes: 10 additions & 12 deletions src/random.cr
Original file line number Diff line number Diff line change
Expand Up @@ -298,19 +298,17 @@ module Random
# slice # => [217, 118, 38, 196]
# ```
def random_bytes(buf : Bytes) : Nil
n = buf.size / sizeof(typeof(next_u))
remaining = buf.size - n * sizeof(typeof(next_u))

slice = buf.to_unsafe.as(typeof(next_u)*).to_slice(n)
slice.each_index { |i| slice[i] = next_u }

if remaining > 0
bytes = next_u
remaining.times do |i|
bits = i * 8
mask = typeof(next_u).new(0xff << bits)
buf[-i - 1] = UInt8.new((bytes & mask) >> bits)
ptr = buf.to_unsafe
finish = buf.to_unsafe + buf.size

while ptr < finish
random = next_u
rand_ptr = pointerof(random).as(UInt8*)
if IO::ByteFormat::SystemEndian != IO::ByteFormat::LittleEndian
rand_ptr.to_slice(sizeof(typeof(next_u))).reverse!
end
rand_ptr.copy_to(ptr, {finish - ptr, sizeof(typeof(next_u))}.min)
ptr += sizeof(typeof(next_u))
end
end

Expand Down

0 comments on commit bc7611e

Please sign in to comment.