Reading 64 bit words
조회 수: 9 (최근 30일)
이전 댓글 표시
I have tried reading a binary file 64 bits at a time, and is not behaving as expecting.
I have a binary file with the word = 0xFAFAFAFA00010001, if I read it like this:
word = fread(fid,1,'uint64'), and look at hex2dec(word), the word is 0xFAFAFAFA00010000 (yes, one bit has been changed).
but if I read:
word_l = fread(fid,1,'uint64'); word_h = fread(fid,1,'uint64'), I get 0x00010001 as hex2dec(word_l) and 0xFAFAFAFA as hex2dec(word_h).
I do not know if the problem is on the read (don't think so), or the 64bit management (I think is here), but I tried doing this too:
a=hex2dec('FAFAFAFA');
b = hex2dec('00010001');
dec2hex(bitshift(a,32))
% Output is 0xFAFAFAFA00000000
dec2hex(b)
% Output is 0x00010001
dec2hex(bitor(bitshift(a,32),b))
% Output is 0xFAFAFAFA00010000
Is there an issue with matlab and numbers larger than 53 bits? 60 bits?
댓글 수: 0
채택된 답변
James Tursa
2020년 9월 29일
Try reading and keeping the type as uint64 (using the *) instead of converting to double:
word = fread(fid,1,'*uint64');
댓글 수: 3
James Tursa
2020년 9월 29일
편집: James Tursa
2020년 9월 29일
I'm not sure what the issue is now. If you use the '*uint64' input format, the 64-bits are read into a uint64 type and all bits are retained. If you use the 'uint64' input format (without the asterisk) the bits are read and then converted to a double, which will lose trailing bits because of the mantissa limitation. Why isn't the '*uint64' format doing what you want?
The hex2dec('FAFAFAFA00010001') function also converts the value to double, losing trailing bits. So that is not a good comparison.
추가 답변 (0개)
참고 항목
카테고리
Help Center 및 File Exchange에서 Import, Export, and Conversion에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!