On Wed, Aug 1, 2012 at 1:55 PM, bob hope <[email protected]> wrote:
> Hi, so in the spirit of not cluttering the forum I will ask my somewhat
> unrelated but still related question here. So I have finished
> implementing this, but have run into one issue, when I XOR strings
> together like this:
>
>   def xor_strings(string_array)
>
>     processed_strings = []
>
>     string_array.each do |string|
>       processed_strings << NArray.to_na(string, "byte")
>     end
>
>     processed_strings.inject(:^).to_s
>   end
>
> the result is not always the same size as the set of strings. I believe
> some optimization is being done for me and I need to avoid it, however
> googling for Narray and XOR has not led me to any success. I swear this
> is my last question regarding this, as after I have this fixed I am all
> the way done :D

I am really not sure what you're after, but maybe this does help:

irb(main):013:0> x = SecureRandom.random_bytes(10)
=> "\r\xC8\xA9\x99\t\f\x12\xC9#]"
irb(main):014:0> y = SecureRandom.random_bytes(10)
=> "\x12\x86p?\x19q2\xA6\e\x88"
irb(main):015:0> z = "".force_encoding 'BINARY'
=> ""
irb(main):016:0> x.each_byte.zip(y.each_byte) {|a,b| z<<(a^b)}
=> nil
irb(main):017:0> z.length
=> 10
irb(main):018:0> z
=> "\x1FN\xD9\xA6\x10} o8\xD5"

Or, for multiple strings

irb(main):020:0> z = "".force_encoding 'BINARY'
=> ""
irb(main):024:0> max = arr.map(&:bytesize).max
=> 10
irb(main):025:0> max.times {|i| z[i] = arr.inject(0) {|agg, bytes| b =
bytes[i]; b ? agg ^ b.ord : agg}.chr}
=> 10
irb(main):026:0> z
=> "\x1FN\xD9\xA6\x10} o8\xD5"

Kind regards

robert

-- 
remember.guy do |as, often| as.you_can - without end
http://blog.rubybestpractices.com/

-- You received this message because you are subscribed to the Google Groups 
ruby-talk-google group. To post to this group, send email to 
[email protected]. To unsubscribe from this group, send email 
to [email protected]. For more options, visit this 
group at https://groups.google.com/d/forum/ruby-talk-google?hl=en

Reply via email to