Преобразование 32-битного шестнадцатеричного в 32-битное с плавающей запятой (IEEE 754) в Matlab - PullRequest
2 голосов
/ 08 марта 2011

Как я могу изменить 32-битное шестнадцатеричное значение на значение с плавающей запятой согласно IEEE 754?

РЕДАКТИРОВАТЬ:

...
data = fread(fid,1,'float32');
disp(data);
...

Я получаю этот ответ:

4.2950e + 009 1.6274e + 009 ...

Но как мне получить 32-разрядные числа с плавающей запятой (IEEE 754)?

1 Ответ

3 голосов
/ 08 марта 2011

На основании одного из ваших комментариев выясняется, что ваши шестнадцатеричные значения хранятся в виде строк символов в файле.Сначала вы хотите прочитать эти символы из файла группами по 8. В зависимости от конкретного формата вашего файла (например, каждый набор из 8 символов находится в отдельной строке или они разделены запятыми и т. Д.), Вы можетеиспользуйте для этого такие функции, как FSCANF или TEXTSCAN .Например, если ваш файл данных выглядит следующим образом:

409BFFFF
3B3C0000
85E60000

Тогда вы можете прочитать данные в массив символов следующим образом:

fid = fopen(fileName,'r');  %# Open the file
data = textscan(fid,'%s');  %# Read the data
charArray = char(data{1});  %# Create a character array
fclose(fid);                %# Close the file

Теперь вам нужно преобразовать эти 32-битовые шестнадцатеричные строки для представления с одинарной точностью.На сегодняшний день самый простой способ - использовать функцию HEX2DEC для преобразования строк в целые числа (сохраняемые как значения двойной точности), преобразования их в 32-разрядные целые числа без знака с использованием функции UINT32 затем приведите 32-битные целые числа к представлениям одинарной точности, используя функцию TYPECAST .Применение этого к приведенным выше образцам данных дает следующие результаты:

>> values = typecast(uint32(hex2dec(charArray)),'single');
>> fprintf('% 1.42f\n',values);  %# Display the values
 4.874999523162841800000000000000000000000000
 0.002868652343750000000000000000000000000000
-0.000000000000000000000000000000000021629096

Вы можете подтвердить правильность этих результатов, используя этот онлайн-преобразователь шестнадцатеричной системы в числа с плавающей запятой .


В случае, если кому-то это интересно, вы можете самостоятельно выполнить приведенное выше преобразование типов, используя функцию HEX2DEC , чтобы сначала преобразовать строку в целочисленное представление, затем функцию BITGET для извлечения и обработки битов для знака , показателя степени и дроби числа с одинарной точностью .Например:

>> a = '409BFFFF';  %# A sample hexadecimal value
>> b = hex2dec(a);  %# Convert to an integer
>> sign = bitget(b,32);                               %# Compute the sign
>> exponent = bitget(b,24:31)*2.^(0:7).';            %'# Compute the exponent
>> fraction = bitget(b,1:23)*2.^(-23:-1).';          %'# Compute the fraction
>> value = (-1)^sign*(1+fraction)*2^(exponent-127);   %# Compute the value
>> fprintf('%1.7f\n',value)                           %# Display the value
4.8749995
...