From: Jason Larsen Date: 2010-10-12T13:35:15+09:00 Subject: Bit Manipulation for a Pure Ruby SHA1 implementation I'm trying to write a pure Ruby implementation of SHA1. In order to do so, I need to be able to directly manipulate bits. I know about the bitwise operators in Ruby, but I'm having issues with the way that Ruby wraps things up in classes. Basically I've run into two problems. PROBLEM 1: I need to pad the message by appending a 1-bit, and then a certain number of 0s. When appending numbers (e.g. 0b1) to the end of by string, Ruby wraps each number in its Fixnum class making it 1 byte long: So basically adding 0b1 appends 0b0000_0001, which is 7 zeros that shouldn't be there. The fix I've found is I to tack 0x80 on the end, which concats 0b1000_0000. The downside is that I have to keep track of my zeros in batches of bytes (which at this point my implementation handles alright), but I'd like to know how to do it bit by bit if possible. I've seen the String.unpack and Array.pack used for binary data. However, I can only get the bits out in one glob str.unpack("B*"), or str.unpack("B8"*string.length), which still just gives me a bunch of stringified 8bit binary values. Seems like there should be a better way. PROBLEM 2: After adding a one-bit and k zeros, I need to append a 64- bit long integer representing the length of the message being hashed. It seem like Fixnum is 8 bytes long on my machine, so the question is how do I add a 64bit binary representation of this number to the end of a string? Any help would be greatly appreciated. Thanks in advance.