retrieve binary data back
1 view (last 30 days)
Show older comments
I have a binary data as
00 10 11 01 10 11 11 01
I need to replace this data as if
00 = 0
01 = 1
10 or 11 = *
if i get a new data as below
0 * * 1 * * * 1
can you suggest any way to get back the binary data
00 10 11 01 10 11 11 01
1 Comment
Rik
on 17 Mar 2019
Because your mapping is not unique, this is not possible. There is no way for the reverser to know if you * was 10 or 11, so it will not be able to return a perfect reconstruction.
Accepted Answer
Rik
on 18 Mar 2019
In case you wanted to accept my answer, I'll repost my code in an actual answer. However, I would suggest you use Madhan's solution. That one ignores the last bit if the length is odd (which might not be what you want), while my code throws an error.
data='0010110110111101';
replace_with={'00','0';'01','1';'10','*';'11','*'};
key_list=replace_with(:,1);
val_list=replace_with(:,2);
%check for even numbers:
if rem(numel(data),2)~=0
error('bits are not paired')
end
%convert to 1 pair per cell
datacell=mat2cell(data,1,2*ones(numel(data)/2,1));
% %loop through the replacer elements
% for n=1:numel(key_list)
% datacell(ismember(datacell,key_list{n}))=val_list(n);
% end
inds=cellfun(@(x) find_indices(x,key_list),datacell);
L= inds~=0;
datacell(L)=val_list(inds(L));
%convert back to a char array
result=cell2mat(datacell);
clc,disp(result)
%local function:
function inds=find_indices(element,key_list)
[~,inds]=ismember(element,key_list);
end
3 Comments
More Answers (2)
madhan ravi
on 18 Mar 2019
Edited: madhan ravi
on 18 Mar 2019
c=strjoin(regexp(c,'\d{2}+','match')); % for safety measure
% ^----- your original binary data
Actual_datas={'00','01','10|11',' '};
Replace_with={'0','1','*',''};
D=regexprep(c,Actual_datas,Replace_with)
0 Comments
Image Analyst
on 17 Mar 2019
Use strrep(). Try this:
str = '00 10 11 01 10 11 11 01'
% Make the length a multiple of three.
while rem(length(str), 3) ~= 0
str = [str, ' '];
end
% Make replacements
% 00 = 0
% 01 = 1
% 10 or 11 = *
str = strrep(str, '00 ', '0 ')
str = strrep(str, '01 ', '1 ')
str = strrep(str, '10 ', '* ')
str = strrep(str, '11 ', '* ')
% If desired, trim off any trailing or leading spaces.
str = strtrim(str)
4 Comments
Rik
on 17 Mar 2019
Edited: Rik
on 17 Mar 2019
Judging by the track record of Elysi I wouldn't call them a beginner anymore, but just in case other/future readers need an example (which assumes the spaces are not in the actual data):
data='0010110110111101';
replace_with={'00','0';'01','1';'10','*';'11','*'};
key_list=replace_with(:,1);
val_list=replace_with(:,2);
%check for even numbers:
if rem(numel(data),2)~=0
error('bits are not paired')
end
%convert to 1 pair per cell
datacell=mat2cell(data,1,2*ones(numel(data)/2,1));
% %loop through the replacer elements
% for n=1:numel(key_list)
% datacell(ismember(datacell,key_list{n}))=val_list(n);
% end
inds=cellfun(@(x) find_indices(x,key_list),datacell);
L= inds~=0;
datacell(L)=val_list(inds(L));
%convert back to a char array
result=cell2mat(datacell);
clc,disp(result)
%local function:
function inds=find_indices(element,key_list)
[~,inds]=ismember(element,key_list);
end
See Also
Categories
Find more on Numeric Types in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!