# Open a binary file-read bit-change bit-update same file

**URL:** <https://www.ruby-forum.com/t/open-a-binary-file-read-bit-change-bit-update-same-file/179187>\
**Category:** Ruby\
**Created:** [November 19, 2009, 8:26am UTC](https://www.ruby-forum.com/t/open-a-binary-file-read-bit-change-bit-update-same-file/179187 "2009-11-19T08:26:16Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![mokkai](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/c2a13f/32.png) [@mokkai](https://www.ruby-forum.com/u/mokkai)\
**Post date:** [November 19, 2009, 8:26am UTC](https://www.ruby-forum.com/t/open-a-binary-file-read-bit-change-bit-update-same-file/179187/1 "2009-11-19T08:26:16Z")

</div>

my Aim is i want to encrypt a file

i want to open a binary file

i want to read the 1-st bit  
if the bit is “1” then update that position bit to “0” instantly  
if the bit is “0” then update that position bit to “1” instantly

then i have to read 2-nd bit  
do the same thing like above conversion  
…  
…  
like i want to do this for all bit of that file

* * *

i know we can read the file into a array then we can do the  
modification,etc  
but i want to update on that same file object, and the file size may be  
more then 1 GB

is it possible?  
any idea and help is very much appreciated

---

<div class="post-metadata">

**Author:** ![mokkai](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/c2a13f/32.png) [@mokkai](https://www.ruby-forum.com/u/mokkai)\
**Post date:** [November 19, 2009, 10:21am UTC](https://www.ruby-forum.com/t/open-a-binary-file-read-bit-change-bit-update-same-file/179187/2 "2009-11-19T10:21:47Z")

</div>

2009/11/19 Sniper A. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> …
> 
> is it possible?

Anything is possible. But doing it bitwise is extremely inefficient.  
You should rather do it in chunks of, say, 1025 or 512 bytes or - even  
better - use the cluster size of your file system.

XOR will be useful

irb(main):004:0\> a = 11  
=\> 11  
irb(main):005:0\> sprintf “%08b → %08b”, a, a ^ 0xFF  
=\> “00001011 → 11110100”

Kind regards

robert

---

<div class="post-metadata">

**Author:** ![mokkai](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/c2a13f/32.png) [@mokkai](https://www.ruby-forum.com/u/mokkai)\
**Post date:** [November 19, 2009, 12:29pm UTC](https://www.ruby-forum.com/t/open-a-binary-file-read-bit-change-bit-update-same-file/179187/3 "2009-11-19T12:29:58Z")

</div>

You can synchronize io setting file.sync = true to update on the same  
file object

---

<div class="post-metadata">

**Author:** ![mokkai](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/m/c2a13f/32.png) [@mokkai](https://www.ruby-forum.com/u/mokkai)\
**Post date:** [November 19, 2009, 1:54pm UTC](https://www.ruby-forum.com/t/open-a-binary-file-read-bit-change-bit-update-same-file/179187/4 "2009-11-19T13:54:15Z")

</div>

2009/11/19 Dalthon [BR] [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> You can synchronize io setting file.sync = true to update on the same  
> file object

That does only change the point in time _when_ the change in the file  
can be observed by other processes but it does not affect _where_ the  
changes are written. For that (i.e. writing to the same file) you  
need File.open(name, “r+”) anyway.

If you use that option and do “bitwise” updates (actually only  
bytewise is possible) efficiency will drop even more dramatically.

Kind regards

robert
