按照用户输入的公式实现 给定数据的各个bit的重映射,输出新数据。
下载地址,连同源码包。
http://download.csdn.net/detail/delacroix_xu/3898547
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace dataBitConvert
{
public partial class BitConverter : Form
{
public BitConverter()
{
InitializeComponent();
textBox_bit_remap.Text = "27,26,25,24 ,23,22,21,20 ,19,18,17,16 ,15,14,13,12 ,11,10,9,8 ,7,6,5,4 , 3,2,1,0 ,39,38,37,36 ,35,34,33,32 ,31,30,29,28 ";
textBox1.Text =
"X\"0808000000\" \r\n" +
"x\"1408000000\" \r\n" +
"x\"0010002240\" \r\n" +
"x\"801ffffffc\" \r\n" +
"x\"401ffffffc\" \r\n" +
"x\"c010002240\" \r\n" +
"x\"201ffffffc\" \r\n" +
"x\"a01ffffffc\" \r\n" +
"x\"6010000000\" \r\n" +
"x\"e010000000\" \r\n" +
"x\"1010000000\" \r\n" +
"x\"9010000040\" \r\n" +
"x\"5010000000\" \r\n" +
"x\"d010000000\" \r\n" +
"x\"30104a1a50\" \r\n" +
"x\"b01ffffffc\" \r\n" +
"x\"7010002240\" \r\n" +
"x\"f01ffffffc\" ";
}
private string tag_start_str = "\"";
private string tag_end_str = "\"";
private void Convert_Click(object sender, EventArgs e)
{
textBox2.Text = "";
textBox1.Text = textBox1.Text.ToUpper();
string strsrc = textBox1.Text;
string[] strSrcs1 = new string[100];
DataBit[] dbit = new DataBit[100];
int u = 0;
while (strsrc.IndexOf(tag_start_str) > 0)
{
int index_word_start = 0;
int index_word_end = 0;
index_word_start = strsrc.IndexOf(tag_start_str) + tag_start_str.Length;
string strsrc_sub = strsrc.Substring(index_word_start);
index_word_end = strsrc_sub.IndexOf(tag_end_str);
string tempNumStr = strsrc.Substring(index_word_start, index_word_end);
dbit[u] = new DataBit();
dbit[u].bitChar = tempNumStr.ToCharArray();
dbit[u].value_src = DataBit.atoihex(dbit[u].bitChar);
u++;
strsrc = strsrc_sub.Substring(index_word_end + tag_end_str.Length);
}
//convert dec to binary
for (int i = 0; null != dbit[i]; i++)
dbit[i].Gen_bit_src();
//convert ... bits remap
string mapStr = textBox_bit_remap.Text;
string[] bitPosStr = new String[100];
bitPosStr = mapStr.Split(',');
for (int j = 0; null != dbit[j]; j++)
{
int indexofmap;
for (int i = 0; i < bitPosStr.Length; i++)
{
indexofmap = int.Parse(bitPosStr[i]);
dbit[j].bit_dst[i] = dbit[j].bit_src[indexofmap];
}
}
//Gen New Data to value_dst
for (int i = 0; null != dbit[i]; i++)
dbit[i].Gen_bit_dst();
for (int i = 0; null != dbit[i]; i++)
textBox2.Text += "##" + CryptString.ConvertToHexStr(dbit[i].value_dst.ToString()) + "$\r\n";
}
private void button_help_Click(object sender, EventArgs e)
{
string str = "上面的输入框,是指的转换公式,意思是\nbit0对应bit27\nbit1对应bit26\n" +
"...\n...\n以此类推\n" +
"左边的框,是输入数据的框,支持多行数据,"+
"数据开头和结尾要用英文双引号,例如\n sfsdafdsf\"0810007ffc\"sdfdsfdasf \n"+
"首尾之外的其他字符自动忽略,对以上数据,程序会自动取出0x0810007ffc\n"+
"转换之后的数据开头和结尾已经固定,用户需使用其他编辑器自行转换成自己所需的格式";
MessageBox.Show(str);
}
}
public class DataBit
{
public ulong value_src = 0;
public ulong value_dst = 0;
public int[] bit_src = new int[128];
public int[] bit_dst = new int[128];
public char[] bitChar = new char[100];
static public ulong atoihex(char[] charArray)
{
ulong m_integer = 0;
int u = charArray.Length;
for (int i = 0; i < u; i++)
{
if (charArray[i] <= '9' && charArray[i] >= '0')
m_integer = m_integer * 16 + charArray[i] - '0';
else
if (charArray[i] <= 'f' && charArray[i] >= 'a')
m_integer = m_integer * 16 + charArray[i] - 'a' + 10;
else
if (charArray[i] <= 'F' && charArray[i] >= 'A')
m_integer = m_integer * 16 + charArray[i] - 'A' + 10;
else
{
MessageBox.Show("error1");
}
}
return m_integer;
}
public void Gen_bit_src()
{
for (int i = 0; i < this.bit_src.Length; i++)
this.bit_src[i] = 0;
ulong src_temp = this.value_src;
int u = 0;
while (src_temp != 0)
{
this.bit_src[u] = (1 == (src_temp % 2))?1:0;
u++;
src_temp = src_temp / 2;
}
test
ulong testvalue = 0;
for (int i = this.bit_src.Length - 1; i >= 0; i--)
testvalue = testvalue * 2 + (ulong)this.bit_src[i];
if (testvalue != this.value_src)
{
MessageBox.Show("error2");
}
}
public void Gen_bit_dst()
{
value_dst = 0;
for (int i = this.bit_dst.Length - 1; i >= 0 ; i--)
this.value_dst = value_dst * 2 + (ulong)this.bit_dst[i];
}
}
public class CryptString
{
///
/// 转换数字成单个16进制字符,要求输入值小于16
///
/// value
///
public static string GetHexChar(string value)
{
string sReturn = string.Empty;
switch (value)
{
case "10":
sReturn = "A";
break;
case "11":
sReturn = "B";
break;
case "12":
sReturn = "C";
break;
case "13":
sReturn = "D";
break;
case "14":
sReturn = "E";
break;
case "15":
sReturn = "F";
break;
default:
sReturn = value;
break;
}
return sReturn;
}
///
/// 返回进制字符串
///
/// value
///
public static string ConvertToHexStr(string value)
{
string sReturn = string.Empty;
try
{
while (ulong.Parse(value) >= 16)
{
ulong v = ulong.Parse(value);
sReturn = GetHexChar((v % 16).ToString()) + sReturn;
value = Math.Floor(Convert.ToDouble(v / 16)).ToString();
}
sReturn = GetHexChar(value) + sReturn;
}
catch
{
sReturn = "###Valid Value!###";
}
return sReturn;
}
}
}