[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

reading/writing binary problem

Wolfgang

3/29/2006 2:22:00 PM

Hi,

I have some binary files which I need to delete some data at the
beginning of the file (to extract the raw data out of the file). I got a
matlab file from a colleque but I would prefer if I could do it with ruby.

This matlab code does the trick:
function m=write_rad(filename)
file=fopen(filename);
f= fread(file,'uint16');

[r,k]=size(f);
if k==1;
t=r-1048576;
m=f(t+1:r,:);
end
end % function

How can I do this in ruby? I'm completely lost.

Thanks
Wolfgang
8 Answers

Robert Klemme

3/29/2006 3:12:00 PM

0

Wolfgang wrote:
> Hi,
>
> I have some binary files which I need to delete some data at the
> beginning of the file (to extract the raw data out of the file). I got a
> matlab file from a colleque but I would prefer if I could do it with ruby.
>
> This matlab code does the trick:
> function m=write_rad(filename)
> file=fopen(filename);
> f= fread(file,'uint16');
>
> [r,k]=size(f);
> if k==1;
> t=r-1048576;
> m=f(t+1:r,:);
> end
> end % function
>
> How can I do this in ruby? I'm completely lost.

An easy solution is to copy the file:

Untested:

def cut_prefix(file, length)
raise ArgumentError, "negative length" if length < 0

bak = file + ".bak"
File.rename file, bak

File.open(bak,"rb") do |io_r|
io_r.seek length

File.open(file, "wb") do |io_w|
while ( buffer = io_r.read(4096) )
io_w.write(buffer)
end
end
end
end

Another solution would be to do it internally with continuously seeking,
reading, seeking, writing etc.

Kind regards

robert

Ara.T.Howard

3/29/2006 3:40:00 PM

0

Wolfgang

3/29/2006 4:12:00 PM

0

Hello,

yes I want to extract a matrix of 1024x1024 of binary data (2bytes for
each value). But ahead of this data is 1048576 bit (13312 bytes) of
crap. I don't know matlab at all and I don't like to start this routine
when I want to import that data into my application, which can not skip
this header. If it is easier to do by a linux command (its running in
cygwin) any help is also welcome.

Wolfgang

PS: I will also test the example of Robert


ara.t.howard@noaa.gov schrieb:
> On Wed, 29 Mar 2006, Wolfgang wrote:
>
>> Hi,
>>
>> I have some binary files which I need to delete some data at the
>> beginning of the file (to extract the raw data out of the file). I got
>> a matlab file from a colleque but I would prefer if I could do it with
>> ruby.
>>
>> This matlab code does the trick:
>> function m=write_rad(filename)
>> file=fopen(filename);
>> f= fread(file,'uint16');
>>
>> [r,k]=size(f);
>> if k==1;
>> t=r-1048576;
>> m=f(t+1:r,:);
>> end
>> end % function
>>
>> How can I do this in ruby? I'm completely lost.
>>
>> Thanks
>> Wolfgang
>
> this sould be easy if i understood that method and the nature of your
> data ;-)
>
> here's what i understand this method to do :
>
> # open the file
>
> file=fopen(filename);
>
> # read all available unit16 quantities into an [m, n] array
>
> f= fread(file,'uint16');
>
> # check the size of this array, r is the number of elements read
>
> [r,k]=size(f);
>
> # k will be one iff data was read into r dimension
>
> if k==1;
>
> # here i assume 1048576 is the 'row_size' of 1mb. we set t to be the
> offset
> # of the last row
>
> t=r-1048576;
>
> # because matlab is evil and uses one based indexing, we inc t by one and
> # extract the last row/block of data. but here it seems like the ith
> index
> # should be t+1:r-1048576 no? otherwise it seems like this would be
> out of
> # bounds?
>
> m=f(t+1:r,:);
>
>
> in any case this looks alot like you are trying to extract the last 1mb of
> uint16 quantities from a data file - is that right? let me know and
> i'll show
> you how to do this.
>
> regards.
>
> -a

Ara.T.Howard

3/29/2006 4:32:00 PM

0

Daniel Harple

3/29/2006 4:40:00 PM

0

On Mar 29, 2006, at 6:31 PM, ara.t.howard@noaa.gov wrote:

> open(path){|f| f.seek(13312); f.read(1024*1024*2)}

If you are using Windows don't forget to open it in binary mode:

open(..., 'rb') ...

-- Daniel


Robert Klemme

3/29/2006 4:50:00 PM

0

Daniel Harple wrote:
> On Mar 29, 2006, at 6:31 PM, ara.t.howard@noaa.gov wrote:
>
>> open(path){|f| f.seek(13312); f.read(1024*1024*2)}
>
> If you are using Windows don't forget to open it in binary mode:
>
> open(..., 'rb') ...

In fact I recommend to use that switch regardless of OS used: it's more
portable and also serves as documentation hint that the file is actually
binary.

Kind regards

robert

Ara.T.Howard

3/29/2006 4:58:00 PM

0

Wolfgang

3/29/2006 6:14:00 PM

0