1.概述
前段时间,因为项目需要,需要方便对base64解码后的数据查看,网上找了一通,只有解码编码,但没有方便进行结构解析的。于是自己写了一个。
2.代码
解码分析
void btn_decode_Click(object sender, EventArgs e)
{
if (tbx_src.Text.Length > 3)
{
try
{
StringBuilder sb = new StringBuilder();
byte[] outputb = Convert.FromBase64String(tbx_src.Text);
if (ckb_hex.Checked)
{
tbx_out.Text = byte2hexstring(outputb);
}
else
{
tbx_out.Text = Encoding.Default.GetString(outputb);
}
//
lab_len.Text = "解码结果长度:" + outputb.Length.ToString();
int num = 0;
int stlen = 0;
int[] stsize = new int[comboBoxes.Length];//大小
int[] stpos = new int[comboBoxes.Length]; //位置
foreach (var cb in comboBoxes)
{
if (cb.SelectedIndex != 0)
{
if (cb.SelectedIndex == 1) { stpos[num] = stlen; stlen += 1; stsize[num] = 1; }
else
if (cb.SelectedIndex == 2) { stpos[num] = stlen; stlen += 2; stsize[num] = 2; }
else
if (cb.SelectedIndex == 3) { stpos[num] = stlen; stlen += 4; stsize[num] = 4; }
num++;
}
else break;
}
if (stlen == 0) { lab_sta.Text = "数据结构未设置" ; return; }
int len = outputb.Length / stlen; //多少组数据
lab_sta.Text ="结构数目:"+ len.ToString();
for (int j = 0; j < len; j++)
{
for (int i = 0; i < num; i++) //数据结构内部
{
sb.Append(textBoxes[i].Text);
sb.Append(":");
if (stsize[i] == 1)
{
int a = 0;
a = outputb[j * stlen + stpos[i]];
if (checkBoxes[i].Checked )
{
if (a > 127) a = a-0x100 ;
}
sb.Append(a.ToString().PadLeft(4, ' '));
}
else if (stsize[i] == 2)
{
if(checkBoxes[i].Checked)
{
Int16 a = 0;
a = (Int16)((Int16)(outputb[j * stlen + stpos[i]] << 0)+
(Int16)((Int16)outputb[j * stlen + stpos[i] + 1] << 8));
sb.Append(a.ToString().PadLeft(6, ' '));
}
else
{
UInt16 a = 0;
a = (UInt16)((UInt16)((UInt16)outputb[j * stlen + stpos[i]] << 0)
+ (UInt16)((UInt16)outputb[j * stlen + stpos[i] + 1] << 8));
sb.Append(a.ToString().PadLeft(6, ' '));
}
}
else if (stsize[i] == 4)
{
if (checkBoxes[i].Checked)
{
int a = 0;
a = ((int)outputb[j * stlen + stpos[i] + 0] << 0)
+ ((int)outputb[j * stlen + stpos[i] + 1] << 8)
+ ((int)outputb[j * stlen + stpos[i] + 2] << 16)
+ ((int)outputb[j * stlen + stpos[i] + 3] << 24);
sb.Append(a.ToString().PadLeft(13, ' '));
}
else {
uint a = 0;
a = ((uint)outputb[j * stlen + stpos[i] + 0] << 0)
+ ((uint)outputb[j * stlen + stpos[i] + 1] << 8)
+ ((uint)outputb[j * stlen + stpos[i] + 2] << 16)
+ ((uint)outputb[j * stlen + stpos[i] + 3] << 24);
sb.Append(a.ToString().PadLeft(13, ' '));
}
}
sb.Append(" ");
}
sb.Append("\r\n");
}
tbx_show.Text = sb.ToString();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
else
{
lab_sta.Text = "数据不足";
lab_len.Text = "";
}
}
编码
private void btn_encode_Click(object sender, EventArgs e)
{
if (tbx_src.Text.Length > 3)
{
try
{
byte[] bytes = Encoding.Default.GetBytes(tbx_src.Text);
tbx_out.Text = Convert.ToBase64String(bytes);
lab_len.Text = "编码结果长度=" + bytes.Length.ToString();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
else
{
lab_sta.Text = "数据不足";
lab_len.Text = "";
}
}
为避免重复设置结构参数,使用ini文件记录其中数据,下次打开程序可方便加载设置。代码本网站已有大量例程,不再此多此一举粘贴。
3.附件
工具下载:https://download.csdn.net/download/wangzibigan/86736181