swapbytes order problem with uint64?
3 ビュー (過去 30 日間)
古いコメントを表示
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 件のコメント
採用された回答
Matt J
2017 年 9 月 10 日
編集済み: Matt J
2017 年 9 月 10 日
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 件のコメント
Matt J
2017 年 9 月 10 日
Even if you swap the hex string yourself, I suspect you still have to make sure the swapped result obeys flintmax.
その他の回答 (1 件)
Walter Roberson
2017 年 9 月 10 日
Do not use hex2dec() for this purpose. Use sscanf()
sscanf('b0120c0a7799ba3e', '%lx')
ans =
uint64
12687216339351878206
%lx is an unsigned 64 bit format.
2 件のコメント
Walter Roberson
2017 年 9 月 10 日
If you are working with something that is an IEEE double, then
swapbytes(hex2num('b0120c0a7799ba3e'))
参考
カテゴリ
Help Center および File Exchange で Logical についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!