На основании одного из ваших комментариев выясняется, что ваши шестнадцатеричные значения хранятся в виде строк символов в файле.Сначала вы хотите прочитать эти символы из файла группами по 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