请教大神!!报文解析怎样将char数组类型的里面值(16进制)转换成2进制,我试了好几次。乱码啊。开发工具是VS2010,控制台应用程序。不清楚的话我可以截图,各位大牛。今天下班之前要交。谢谢!!
截图,贴代码。
@携着你去看海: 不能,你贴代码吧
@Launcher:
using System; using System.Collections.Generic; using System.Text; using System.IO; namespace MySecondMainTest { class Program { static void Main(string[] args) { string line; try { StreamReader sr = new StreamReader("E:/ExampleBaowen.txt"); line=sr.ReadLine(); string [] temp = line.Split(' '); while (line != null) { Console.WriteLine(line); line = sr.ReadLine(); } string str=null; foreach (var x in temp) { str += x; } Console.WriteLine(str); char[] tempFour = str.Substring(26, 8).ToCharArray(); string s = new string(tempFour); byte[] data = Encoding.Unicode.GetBytes(s); string strT = str.Substring(14, 2); //可以不用看下面判断的内容 if (strT != null) { if (strT == "61") { Console.WriteLine(" 该报文的帧类型是重要遥测"); } else if (strT == "C2") { Console.WriteLine(" 该报文的帧类型是次要遥测"); } else if (strT == "F4") { Console.WriteLine(" 该报文的帧类型是正常遥信"); } else { Console.WriteLine(" 数据异常"); } //字符串转变成二进制 StringBuilder result = new StringBuilder(data.Length*8); foreach(char b in data) { result.Append(Convert.ToString(b, 2).PadLeft(8, '0')); Console.WriteLine(result); } } //字符串类型转变为字 sr.Close(); Console.ReadLine(); } catch (Exception e) { Console.WriteLine("Exception: " + e.Message); } finally { Console.WriteLine("Executing finally block."); } } } }
@携着你去看海:
StreamReader sr = new StreamReader("E:/ExampleBaowen.txt"); // 这里的 .txt 文件是啥编码?
@Launcher: 放在E盘的文本文档。内容EB 90 EB 90 EB 90 71 61 01 01 02 60 02 AB 73 6F 08 06 。我需要去最后一组AB 73 6F 08,转换成二进制控制台输出。。。
@携着你去看海: 什么编码? 是 GB2312 UTF-8 UNICODE ?
@Launcher: 就是3组数据啊,是文档里面写的随机报文。我可以随便写的02 05 42 65 69 99 每组有六个,分为三组。早上我能够去除单个的A B 7 3 6 F 0 8.下午转换的时候就乱码
@携着你去看海: 对比下面两条语句的结果:
byte[] data = Encoding.Unicode.GetBytes("2");
byte[] data = Encoding.UTF8.GetBytes("2");
@Launcher: 没什么区别,一样的。给你看下显示的效果
01000001
01000001 01000010
01000001 01000010 00110111
01000001 01000010 00110111 00110011
01000001 01000010 00110111 00110011 00110110
01000001 01000010 00110111 00110011 00110110 00110000
01000001 01000010 00110111 00110011 00110110 00110000 00111000
还有就是同一行之间每空格,我是为了方便看才留下来的
@携着你去看海: 你是睁眼说瞎话!
byte[] data = Encoding.Unicode.GetBytes("2"); // 这里的 data.Length 为 2
byte[] data = Encoding.UTF8.GetBytes("2"); // 这里的 data.Length 为 1.
@Launcher: 。。。。。好吧,怪不得每次元素的总数这么大呢,我的错!!- -
@携着你去看海: 你倒底想做啥?难道是把字符串 "B7" 转换成字符串 "10110111"?
@Launcher: 嗯嗯,就是这个意思。。。现在我写文档的时候才看到你回我消息,不好意思啊。觉得你挺厉害的,居然能明白我想说的意思。哈哈
@携着你去看海: 我估计你应该这样转:
string hexValue = "B7"; // 对应十进制数 183
// 先转换成十进制数
byte decValue = Convert.ToByte(hexValue,16);
// 再从十进制数转换为二进制的字符串变现形式
string binValue = Convert.ToString(decValue,2); // 10110111
@Launcher: 用你的方法解决问题了。
foreach (char item in tempFour) { byte decValue = Convert.ToByte(item.ToString(), 16); // 再从十进制数转换为二进制的字符串变现形式 binValue = Convert.ToString(decValue, 2).PadLeft(4, '0'); // 10110111 Console.WriteLine(binValue); } 谢谢!