2013-10-01 5 views
1

У меня есть некоторые данные, которые хранятся как логический массив Nx32. Каждая строка представляет одно слово данных UDP, которое я отправляю. Я храню его как логический массив, потому что я могу получить доступ к любому слову, части слова или даже к границам слов. (То есть, я мог бы хранить uint32 как [array(1, 17:32) array(2, 1:16)].На данный момент я нахожу данные, которые пользователь хочет на основе позиции входного слова, LSB и MSB.Есть ли функциональность C-соединения в MATLAB?

Функциональность, которую я пишу в классы для чтения/записи из мест в данных по существу требуют, чтобы я преобразовал любой заданный тип или char MATLAB в свою двоичную форму, затем сохранил двоичную форму в логическом массиве или наоборот. В основном существует много num2hex и других преобразований. (Фактически, я пытался конвертировать поплавок в двоичном с помощью, скажем, dec2bin(hex2dec(num2hex(pi))) но вывод неверен!).

в Си union может легко бросить между типами данных. Я мог бы написать int и прочитать его s a float напрямую. Возможна ли эта функция в MATLAB? У меня есть доступ ко всем инструментам, если это помогает.

+0

Все предоставленные ответы помогают делать то, что я хочу, но в конце концов я создаю свой собственный объект 'union_t', который эмулирует поведение, которое я ищу. –

ответ

4

Я не знаком ни с чем, что напрямую совпадает с понятием объединения в Matlab, но можно получить те же результаты (используя больше памяти). Я считаю, что вы ищете typecast, например.

x = uint32([1 2 3]); 
y = typecast(x,'single') 

Если вам необходимо изменить порядок значащего бита, используйте swapbytes.

EDIT: Если вы хотите обрабатывать логические файлы, то вам придется использовать двоичную строку в качестве промежуточного шага. Я думаю, что dec2bin должно быть хорошо (не нужно идти в шестнадцатеричный, насколько я вижу), и, может быть, ваша проблема заключается в том, что вы не предоставляете необязательный второй аргумент, указывающий, сколько бит нужно писать?

x = dec2bin(22,32) 

вы можете конвертировать в логические и переворачивать байты с

y = x=='1'; 
y = fliplr(y); 

Вы можете также возможно посмотреть в использовании Java внутри Matlab, например, это для для двойников:

x = java.lang.Double.doubleToLongBits(22); 
y = java.lang.Long.toBinaryString(x) 
+0

Предыдущие итерации моего кода значительно расширили использование 'typecast'. В этих итерациях я сохранял свои данные как 4 'uint8' вместо 32 'логических'. Это хорошо работает, когда пользователь не пытается охватить границы слов, но моя программа должна позволять пользователям делать такие вещи. 'typecast()' не работает с 'logic', поэтому это решение отсутствует, к сожалению. –

1

Использование dec2bin (hex2dec (num2hex (pi))) неточно, поскольку числа с плавающей запятой имеют большие пробелы для больших чисел и не могут точно представлять целые числа. Один из способов - разбить 64-разрядную шестнадцатеричную строку на две 32-разрядные строки. Например,

hexpi = num2hex(pi) 
firstbin = dec2bin(hex2dec(hexpi(1:8))); 
secondbin = dec2bin(hex2dec(hexpi(9:16))); 

% reconstruct 
firsthex = dec2hex(bin2dec(firstbin)); 
secondhex = dec2hex(bin2dec(secondbin)); 
hexpi_reconstructed = [firsthex secondhex] 
pi_reconstructed = hex2num(hexpi_reconstructed) 

Этот код должен воспроизводить те же шестнадцатеричные биты.

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