情景再现
前端时间我得到一份16进制矩阵表格,一些原因使得需要将16进制转为2进制(4位)以供matlab加载使用。我尝试了以下方法:
【方法1】(失败)
我尝试了excel中的查找替换功能 【Ctrl+H】,试图将其在excel里直接转为二进制,发现这种方式会使转换得到的二进制 失去前端的0 ,具体步骤如下,然而这并不能满足我的需求。
上面excel红圈本来数据是6替换后变成了【110】,而不是【0110】,失去了前端的0。
【方法2】(失败)
于是我又想起了excel里的 【设置单元格格式】,选择 【文本】,这个格式设置会使单元格显示的内容与输入完全一致,即你输入【0000】,单元格里也是【0000】,如下图所示。
设置了这个之后,然后我又重复第一个方法的操作,发现得到的结果和方法1是一模一样的。限于自身对excel的熟悉程度,只能利用matlab转换了。
前期数据处理
第一步:利用matlab的【导入数据】,将16进制excel导入matlab。选择数值矩阵,再把非数值的【A-F】替换为【10-15】,这里的替换可以在excel里实现,我也觉得excel转这个还是比较方便的。如下所示:
之所以要替换是因为字母不是数值,不处理的话会使字母被【NaN】替换。
下图是我用excel转10进制导入matlab的展示:
红圈的地方都要注意哦,【LDPC16】将是导入数据的名字。如下所示:
转换开始
那现在我们已经有10进制数据了,该开始转换了!
matlab中有一个函数dec2bin(),它可以将十进制数字转为二进制,不幸的是,转换结果依然会把前端的0丢掉。
丢掉也没事,我们补上就行了对不对。该怎么补?那当然是利用字符来补。
那具体怎么补?我们要求得到的是4位二进制,那么经过dec2bin(),我们无非得到的是这四种二进制:【xxxx】【xxx】【xx】【x】,我们要把他们变成【xxxx】【0xxx】【00xx】【000x】。那我们在得到二进制结果时,将其转换为字符串,再根据其长度加上缺少的0就ok了。最后再把字符串转为数值就行了。
代码如下,注释很详细,应该都看的懂:
%% 十六进制数据表格转二进制矩阵 注:十六->十可以在Excel中完成
[m,n]=size(LDPC16);%获取导入数据的维数
H1=LDPC16;%HO为十进制数据矩阵,备份
A=[];%为十转二准备
B=[];%为填充转换后的二进制序列准备
D=[];%为char->int做准备
for i=1:m
for j=1:n
a=dec2bin(H1(i,j)); %获取十进制转二进制结果
switch(length(a)) %因matlab会删除首0,即序列头部的0的子序列,所以在此补充0,保持四位二进制
case 1
A=['000' a];%二进制1需补充三个0,同时int->char
case 2
A=['00' a];%00xx
case 3
A=['0' a];%0xxx
case 4
A=[a]; %xxxx
end
B=[B A]; %将每个转换结果依次衔接
end
end
for i=1:n*m*4
x=str2num(B(i)); %char->int
D=[D,x]; %将二进制数字依次衔接起来
end
HB=reshape(D,[n*4,m]);
HB=HB';%因matlab按列读取矩阵,因此需转置
save HB %保存转换后的二进制矩阵.mat
转换前后展示:
备注
因为我的数据是LDPC码的矩阵,所以转换后应仍为矩阵,
即把56×64的16进制矩阵变成56×256的2进制矩阵。这个过程表现在维数上仅仅是列扩展4倍而已。但加0转换后的字符串经数值化后是一个数字串,所以要把二进制数字串4位分割恢复为原来的矩阵样式。