2016-08-23 1 views
2

여러 문자열 하나씩 I는 다음과 같이 5 개 문자열 (16 진수)가 :추출 컬럼 MATLAB

a = 40 C0 70 EB; 
b = 40 C0 80 94; 
c = 40 C0 90 59; 
d = 40 C0 A0 13; 
e = 40 C0 B0 DE 

난 후 마지막부터 각 열 (세로 값)가 추출로 저장해야 문자열을 변환 한 다음 동등한 이진 파일로 변환합니다. 아래 그림이 명확한 그림을 보여주기를 바랍니다.

enter image description here

나는 한 번에 수평 한 바이너리 값으로 주어진 진수로 변환 할 수 있었지만 지금은 수직으로 추출한 다음 바이너리로 변환하고 싶습니다. I 작성한 다음과 프리뷰 코드

Data = '40 C0 70 EB';   
str = regexp(Data,' ','split'); 
Ind = cellfun(@length,str); 
str=str(Ind==2); 
%Hex to Binary 
bin = hexToBinaryVector(str,8,'MSBFirst'); 

원하는 출력 : 때 그들이 어레이로서 이진수로 변환하여 저장해야 검색된 첫 번째 열 (입력)의 값 (출력) . 예를 들어 첫 번째 열 (빨간색)의 값은 'EB 94 59 13 DE'이며 해당 이진 값은 [ '1001 0100' '1001 0101' '1001 0110' '1001 0111' '1001 1000' '1001 1001']입니다. . 따라서이 모든 이진 값은 하나의 변수 아래에 배열로 저장해야합니다. 마찬가지로 다른 변수는 다른 변수로 배열로 저장해야합니다. 마크 트웨인의 유명한 말로

+0

질문이 잘 설명되어 나타납니다,하지만 당신이 원하는 것을 이해할 수없는 것 ,,, 당신은 일반 텍스트로 입력 및 원하는 출력을 제공 할 수 있습니까? –

+1

'regexp (Data, '', 'split');''strsplit (Data)'와 동일합니까? – Adriaan

답변

0

여기에 그것을 할 수있는 방법이있다 :

s = {a; b; c; d; e}; % Collect into cell array 
s = cellfun(@strsplit, s, 'UniformOutput', false); % split each string by space 
s = vertcat(s{:}); % arrange as 2D-cell array of strings 
s = fliplr(s); % reverse horizontally. Last column becomes first 
y = dec2bin(hex2dec(s), 8); % convert each string (in linear order) to binary 
y = mat2cell(y, repmat(size(s,1),1,size(s,2))); % split results into a cell array 

결과는 0과 1의 2 차원 문자 배열의 셀 배열입니다. 귀하의 예제 에서이 제공합니다

y{1} = 
11101011 
10010100 
01011001 
00010011 
11011110 
... 
y{4} = 
01000000 
01000000 
01000000 
01000000 
01000000 
+0

답변 해 주셔서 감사합니다. 코드의 마지막 두 줄의 의미를 간단히 설명해주십시오. 특히, y = dec2bin (hex2dec (s), 8); 완벽하게 작동하지만 10 진수 값이 없을 때 dec2bin을 사용해야하는 이유는 무엇입니까? 모든 것이 16 진수입니다. – user161816

+0

@Sagar'hex2bin'과 같은 것이 필요합니다. 존재하지 않기 때문에'hex2dec'과'dec2bin'을 사용합니다. 모든 결과는 8 열로 배열되며 각 행은 2 진수입니다. 마지막 행은 5 행 그룹으로 나눕니다 (여기서 "5"는 원래 변수의 수입니다) –

0

는 :

은 '나는 짧은 편지 코드를 작성할 시간이 없었기 때문에 대신 긴 하나를 썼다.'

이러한 기능을 더 적은 기능으로 결합 할 수 있지만,이 방법은 각 행의 기능을 쉽게 볼 수 있습니다. 예를 들어 gh을 모두 필요로하지는 않습니다. 또한, 내 코드에서 사용한 이름보다 더 많은 설명적인 이름을 선택했습니다!

Data Acquisition Toolbox가 없으므로 dec2bin(hex2dec(hexa))을 사용해야합니다. 다행히도, 당신은 함수를 건너 뛸 수 있습니다! =)

a = '40 C0 70 EB'; b = '40 C0 80 94'; c = '40 C0 90 59'; d = '40 C0 A0 13'; e = '40 C0 B0 DE'; 
cell_block = {a;b;c;d;e} 
cell_block = 
    '40 C0 70 EB' 
    '40 C0 80 94' 
    '40 C0 90 59' 
    '40 C0 A0 13' 
    '40 C0 B0 DE' 

f = @(x) cellfun(@strsplit, x, 'UniformOutput', false); 
g = @(x) cellfun(@hex2dec, x, 'UniformOutput', false).'; 
h = @(x) cellfun(@dec2bin, x, 'UniformOutput', false); 
cells_of_binary_values = h(g(f(cell_block))); 
arrayfun(@(ii) reshape(cells_of_binary_values{ii}.', 1, []), ... 
     1:numel(cells_of_binary_values),'UniformOutput',0) 

ans = 
{ 
    [1,1] = 01000000110000000111000011101011 
    [1,2] = 01000000110000001000000010010100 
    [1,3] = 01000000110000001001000001011001 
    [1,4] = 01000000110000001010000000010011 
    [1,5] = 01000000110000001011000011011110