2014-09-07 3 views
1

Я хотел бы построить каждый 9-ый элемент из файла ASCII с указанной одной колонки 24-разрядное шестнадцатиричное значениеMatlab чтения 24-битного ASCII-шестнадцатеричный файл в 32-разрядное

ex. 
813457 
123456 
241566 
etc.. 

проблема в том, что я не могу заставить Matlab рассматривать значения 800000-FFFFFF как отрицательные, по-видимому, потому что это не знак, расширяющий его на 32 бита.

Я думал разбивая его на строки, а затем преобразование, но sscanf требует «0x», чтобы преобразовать подписанную% я прокляну значения, так что я вынужден использовать неподписанные:

C = textscan(fp, '%s')  %generates 16380x1 cell (instead of normal array?!) 
sscanf (C{1,1}{1,1}, '%x') %convert first ascii hex element from cell to unsigned hex 

Интересно, как test, просто выполнение hex2dec ('FFC00000') приводит к постовому числу, как я могу заставить все строки ascii в файле импортироваться в виде массива подписанных 24 или 32-битных данных?

+0

Просто чтобы убедиться: что соответствующий результат 'FFC00000' быть? –

+0

Это должно быть -4194304 ... как простой тест, используя калькулятор программирования Windows, вы можете ввести отрицательные десятичные значения, а затем переключиться на Hex, чтобы увидеть шестнадцатеричный номер комплимента соответствующего 2. – ben

+0

См. Мой ответ –

ответ

0

Для преобразования вам нужно, вы можете выполнить следующие действия:

  1. Преобразовать из шестнадцатеричной строки в положительное целое число double типа, используя herx2dec, как вы уже сделали.
  2. Преобразуйте это значение в uint32 тип.
  3. Интерпретировать значение uint32 как int32 (конвертировать тип данных без изменения базовых данных), используя typecast.

Пример:

>> typecast(uint32(hex2dec('FFC00000')),'int32') 
ans = 
    -4194304 
+0

Спасибо, за исключением того, что данные уже не расширены (т. Е. Файл имеет данные в 24-битном формате C00000, а не 32-битный FFC00000), поэтому использование hex2dec на C00000 приводит к положительному числу после приведения типов в int32. – ben

+0

@BenNguyen, метод будет работать. Вы должны сначала расширить свою строку с двумя конечными нулями (чтобы получить полное 32-битное шестнадцатеричное представление), выполнить преобразование, затем разделить на «FF» или 256, так как вы будете в десятичной точке в этой точке. так: 'padding = '00'; typecast (uint32 (hex2dec (['C00000' padding])), 'int32')/256' будет производить '-4194304'. И такая же операция с '7F0000', например, приведет к' 8323072'. – Hoki

Смежные вопросы