Hi, I am new and I discovered that the fread by default reads a binary file 1 byte at a time, how can I read the file 3 bytes at a time. Thanks

 채택된 답변

James Tursa
James Tursa 2015년 6월 10일
편집: James Tursa 2015년 6월 10일

0 개 추천

Try something like this. It reads in the entire file as uint8, groups them in 3 bytes, inserts an extra 0 byte in front of the group of 3, and then reinterprets the bytes as 4 byte unsigned integers. If you don't get the result you want, we may have endian issues to deal with and may need to swap bytes.
x = fread(fid,inf,'*uint8'); % read as uint8
x = reshape(x,3,[]); % groups of 3 in columns
[m,n] = size(x); % get size
x = [zeros(1,n,'uint8'); x]; % insert row of 0's at top to get 4 bytes per number
x = typecast(x(:),'uint32'); % reinterpret bytes as 4-byte unsigned integers

댓글 수: 4

Domenico Bellantoni
Domenico Bellantoni 2015년 6월 10일
matlab gives me this error as soon as it executes the first line
Error using fread Invalid precision.
James Tursa
James Tursa 2015년 6월 10일
This is a typo that I am ALWAYS making and will ALWAYS make throughout my life ... unit8 should be uint8.
Domenico Bellantoni
Domenico Bellantoni 2015년 6월 10일
ahha ok, It was also my fault, I copied and pasted it without checking. Ok now it goes through but it stops at the last line with this error:
Error using typecast The first input argument must be a vector.
James Tursa
James Tursa 2015년 6월 10일
Sorry, you grabbed it before my last edit using x(:) in the last line.

댓글을 달려면 로그인하십시오.

추가 답변 (2개)

Guillaume
Guillaume 2015년 6월 10일

2 개 추천

A much simpler solution would have been to read the file with a precision of 'ubit24' (or 'bit24' if the integer are signed), which is basically a 3 byte integer:
x = fread(fid, 'ubit24'); %that's it. all done

댓글 수: 1

James Tursa
James Tursa 2015년 6월 11일
Good one ... I learned something today about formats available for fread.

댓글을 달려면 로그인하십시오.

Walter Roberson
Walter Roberson 2015년 6월 10일

0 개 추천

fread(fid, 3)

댓글 수: 4

Domenico Bellantoni
Domenico Bellantoni 2015년 6월 10일
This reads only the first 3 values
Domenico Bellantoni
Domenico Bellantoni 2015년 6월 10일
I want to read the full 3 bytes
James Tursa
James Tursa 2015년 6월 10일
편집: James Tursa 2015년 6월 10일
Do you mean you have a file of many bytes, and each group of 3 bytes in the file should be read in as an individual number? If so, what type of number? An integer of some sort?
Domenico Bellantoni
Domenico Bellantoni 2015년 6월 10일
편집: Domenico Bellantoni 2015년 6월 10일
@James , yes! Just like that! They are unsigned integer.for each line of the file there is an integer number represented using 3 bytes and I want to read it

댓글을 달려면 로그인하십시오.

카테고리

도움말 센터File Exchange에서 Logical에 대해 자세히 알아보기

제품

태그

질문:

2015년 6월 10일

댓글:

2015년 6월 11일

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by