swapbytes order problem with uint64?
3 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Tony Tse
am 10 Sep. 2017
Kommentiert: Walter Roberson
am 10 Sep. 2017
I find that swapbytes doesn't seem to be behaving correctly for my problem. I have a 64 bits hexidecimal string printed in big-endian: 'b0120c0a7799ba3e'
Manually swapping the bytes give me the expected answer:
typecast(uint64(hex2dec('3eba99770a0c12b0')), 'double')
ans =
1.5855e-06
typecast(swapbytes(uint64(hex2dec('b0120c0a7799ba3e'))), 'double')
ans =
3.5031e-305
or
typecast(uint64(swapbytes(hex2dec('b0120c0a7799ba3e'))), 'double')
ans =
0
The function seem to work correctly for a single precision hexadecimal:
typecast(swapbytes(uint32(hex2dec('0cc9d435'))),'single')
ans =
single
1.5854e-06
Am I missing something, I can certainly write some loops to parse the string but is there a better solution?
0 Kommentare
Akzeptierte Antwort
Matt J
am 10 Sep. 2017
Bearbeitet: Matt J
am 10 Sep. 2017
I suspect the problem is actually in hex2dec(). You are exceeding the flintmax limit described in the hex2dec documentation:
d = hex2dec('hex_value') converts hex_value to its floating-point integer representation. The argument hex_value is a hexadecimal integer stored as text. If the value of hex_value is greater than the hexadecimal equivalent of the value returned by flintmax, then hex2dec might not return an exact conversion.
3 Kommentare
Matt J
am 10 Sep. 2017
Even if you swap the hex string yourself, I suspect you still have to make sure the swapped result obeys flintmax.
Weitere Antworten (1)
Walter Roberson
am 10 Sep. 2017
Do not use hex2dec() for this purpose. Use sscanf()
sscanf('b0120c0a7799ba3e', '%lx')
ans =
uint64
12687216339351878206
%lx is an unsigned 64 bit format.
2 Kommentare
Walter Roberson
am 10 Sep. 2017
If you are working with something that is an IEEE double, then
swapbytes(hex2num('b0120c0a7799ba3e'))
Siehe auch
Kategorien
Mehr zu Logical finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!