吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1734|回复: 7
收起左侧

[其他转载] c# 处理16进制数据的问题 大家有没有更好的写法交流一下

[复制链接]
xzcnmb 发表于 2021-9-17 15:02
最近在学习上位机 通讯协议基本了解了  所以动手操作了一下
但是实际操做的时候问题又来了
那就是对接收数据的处理
因为我收发的都是16进制的数据
发送的话我会写  接受的话涉及到对数据的一个提取 (接受的数据都是完整的一条  需要对数据提取来选择需要的)
之后想了一下 然后网上查了一下  自己写了一个出来   求大佬们批评指正  (随便评分给一波
[C#] 纯文本查看 复制代码
public partial class Form1 : Form    {
        public Form1()
        {
            Control.CheckForIllegalCrossThreadCalls = false;
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
        }

        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)[mw_shl_code=csharp,true]  public string StringTo16(string inSting, Enum16Hex enum16)
        {
            string outString = "";
            byte[] bytes = Encoding.Default.GetBytes(inSting);
            for (int i = 0; i < bytes.Length; i++)
            {
                int strInt = Convert.ToInt16(bytes[i] - '\0');
                string s = strInt.ToString("X");
                if (s.Length == 1)
                {
                    s = "0" + s;
                }
                s = s + AddSplitString(enum16);
                outString += s;
            }
            return outString;
        }

        {

            int count = serialPort1.BytesToRead;
           
            if (count >= 19)
            {
                byte[] buffrr = new byte[count];
                serialPort1.Read(buffrr, 0, count);
                label3.Text = Convert.ToString((buffrr[10] + buffrr[11] * 256));
                label5.Text = Convert.ToString((buffrr[12] + buffrr[13] * 256));
label5.Text = Convert.ToString((buffrr[14] + buffrr[15] * 256));[/mw_shl_code]


网上的16进制转换代码如下



这是通讯协议

这是通讯协议

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| xzcnmb 发表于 2021-9-17 15:03
[C#] 纯文本查看 复制代码
  public string StringTo16(string inSting, Enum16Hex enum16)
        {
            string outString = "";
            byte[] bytes = Encoding.Default.GetBytes(inSting);
            for (int i = 0; i < bytes.Length; i++)
            {
                int strInt = Convert.ToInt16(bytes[i] - '\0');
                string s = strInt.ToString("X");
                if (s.Length == 1)
                {
                    s = "0" + s;
                }
                s = s + AddSplitString(enum16);
                outString += s;
            }
            return outString;
        }
Light紫星 发表于 2021-9-17 15:07
自己定义一个reader和writer,然后定义一些readhead,readint,readbyte之类的函数,然后操作起来就可以很方便了,也可以把数据给包装起来,定义一个类,分析数据然后对应数据赋值给字段
GoodLand 发表于 2021-9-22 19:43
使用二进制字节数据先操作,然后再统一输出字符串,还有就是byte[]长度过长的话还是建议使用StringBuilder
wu0o0pj 发表于 2021-9-23 08:15
字节数组 转 16进制字符串?
BitConverter.ToString(bytes).Replace("-", " ")
 楼主| xzcnmb 发表于 2021-9-23 15:35
wu0o0pj 发表于 2021-9-23 08:15
字节数组 转 16进制字符串?
BitConverter.ToString(bytes).Replace("-", " ")

谢谢  学到了  
不名物 发表于 2021-9-23 17:26
用C语言很好解决,用sprintf就行
 楼主| xzcnmb 发表于 2021-9-26 12:08
不名物 发表于 2021-9-23 17:26
用C语言很好解决,用sprintf就行

问题这是 c#   哈哈   已经解决了  感谢交流
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 11:49

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表