首页 新闻 搜索 专区 学院

如何把16进制数转化为byte[]数组?

0
[已解决问题] 解决于 2017-12-28 14:47

嗨,哈喽

 

    我现在有一组16进制数组:H23H33H30H47H45

    要把这组数据转为byte []

    代码怎么写的,我自己想着是不是如下的写法:

    string[] hex = "H23H33H30H47H45";

 

     string[] hex = convert.Tobyte[5]();

    我知道我写的代码是错的,但是我的想法就是这个样子的,思路就是这样。

    还请懂的朋友们嗮嗮你们正确的代码来,怎么转化为byte[]数组的?

    我之前一位好朋友写的,我看不懂,只是他最近太忙,不好意思打扰他。

    所以来这里寻找下正确 的写法。

 

绿绿山水的主页 绿绿山水 | 菜鸟二级 | 园豆:248
提问于:2017-12-27 11:15
< >
分享
最佳答案
1

是将16进制字符串转换为byte数组?还是将byte数组中的16进制转换为2进制?

var bytes = new Byte[] { 0x23, 0x33, 0x30, 0x47, 0x45 };
奖励园豆:5
dudu | 高人七级 |园豆:37624 | 2017-12-27 12:10

您好

是将16进制转换为byte[]数组。

绿绿山水 | 园豆:248 (菜鸟二级) | 2017-12-27 13:41

代码写出来了,但是报如下错误:

绿绿山水 | 园豆:248 (菜鸟二级) | 2017-12-27 14:02

@绿绿山水: 如果这些16进制是字符编码的话,可以这样:

var bytes = new Byte[] { 0x23, 0x33, 0x30, 0x47, 0x45 };            
Console.WriteLine(Encoding.UTF8.GetString(bytes)); //Output is #30GE
dudu | 园豆:37624 (高人七级) | 2017-12-27 14:10

@dudu: 我是要通过serialport组件发送到串口的,如果使用sonsole.write(),只是写进控制台,这不是我想要的。我的目的只有1 个,把byte[]数组的参数传输到串口。 

绿绿山水 | 园豆:248 (菜鸟二级) | 2017-12-27 15:02

@绿绿山水:

serialPort1.Write(Encoding.UTF8.GetString(bytes));
dudu | 园豆:37624 (高人七级) | 2017-12-27 15:05

@dudu: 报错是没有了。但是这句话应该怎么理解呢?

            serialPort.write()  这个我是知道的。

            就是下面这个Encoding.UTF8.Getstring(bytes) 

            1)这句什么意思,怎么理解?

            2)要获取bytes,必须得用utf8 格式? 为什么? UTF8跟这些16进制以及bytes 有什么关系?为什么要牵涉到UTF8?

绿绿山水 | 园豆:248 (菜鸟二级) | 2017-12-27 16:58

@绿绿山水: bytes中保存的是字符编码

dudu | 园豆:37624 (高人七级) | 2017-12-27 17:00

@dudu: 谢谢你

绿绿山水 | 园豆:248 (菜鸟二级) | 2017-12-27 17:41

@dudu: 你看楼上写的代码,牵涉到2个单词,一个是GetBuffer,一个 是buffer  ,可否对这2个词进行解释一下,因为我已经无数次见到这2个词了,到底有何特殊之处,让你楼上楼下的朋友们写代码都出现了这2个词,干什么用的 ?不仅仅是作为变量名来用的吧?

绿绿山水 | 园豆:248 (菜鸟二级) | 2017-12-28 09:35
其他回答(3)
1

16进制,里面没有H。

你是H分割吧。先分割,然后转,不知道你的23,33是什么进制,如果是10进制,直接转byte

如果是16进制,先转10进制,再转byte。然后存入一个byte集合就ok.

Supper_litt | 园豆:787 (小虾三级) | 2017-12-27 11:26

把具体代码写出来吧。你的大概意思我是明白了。23  和33是16进制。

按照你的思路把具体代码写出来。思路我懂,就是不会写代码哈,哈哈。

支持(0) 反对(0) 绿绿山水 | 园豆:248 (菜鸟二级) | 2017-12-27 11:53
1

public static string GetBufferHexString(this IEnumerable<byte> buffer)
{
var content = new StringBuilder();
foreach (byte t in buffer) content.Append($"{t:X2} ");
return content.ToString();
}
public static byte[] GetBytesFromHexString(this string hexString)
{
hexString = hexString.Trim(' ');
var returnBytes = new byte[hexString.Length / 2];
for (var i = 0; i < returnBytes.Length; i++) returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
return returnBytes;
}

拿去参考。

花飘水流兮 | 园豆:12355 (专家六级) | 2017-12-27 11:48

大师,首先谢谢你,你的境界,我目前还达不到。所以我要问一些基本的问题。

1)第一句的GetBuffer 是个什么意思?为什么要用Buffer?  Buffer 在这里是缓存区的意思吧?

支持(0) 反对(0) 绿绿山水 | 园豆:248 (菜鸟二级) | 2017-12-27 11:58

@绿绿山水: 第二个函数直接用

支持(0) 反对(0) 花飘水流兮 | 园豆:12355 (专家六级) | 2017-12-27 12:37

@花飘水流兮: 第2个函数直接用?指的是哪个函数直接用?

    我想知道为什么要用buffer?  什么情况下要用到buffer?

支持(0) 反对(0) 绿绿山水 | 园豆:248 (菜鸟二级) | 2017-12-27 16:59

@绿绿山水: 

StringToBytes:"H23H33H30H47H45".GetBytesFromHexString();
BytesToString:bytes.GetBufferHexString();

比如你想记下,向串口写了什么,bytes.GetBufferHexString();

支持(0) 反对(0) 花飘水流兮 | 园豆:12355 (专家六级) | 2017-12-27 17:06

@花飘水流兮: 可否解释下buffer?  GetBuffer?  这2个东西(buffer,GetBuffer)我见过无数次了,就是不理解,不知道这2个到底是什么玩意。什么意思,这让我十分苦恼。看到很熟悉,就是不知道什么意思,干什么用的?

支持(0) 反对(0) 绿绿山水 | 园豆:248 (菜鸟二级) | 2017-12-28 08:50

@绿绿山水: buffer是缓冲存储区

an area in a computer's memory where data can be stored for a short time

支持(0) 反对(0) dudu | 园豆:37624 (高人七级) | 2017-12-28 12:03
1

/// <summary>
        /// 发送开锁指令
        /// </summary>
        /// <param name="lockIndex"></param>
        public void OpenLock(int mbIndex, int lockIndex)
        {
            OpenPort();
            string command = IntToHex_1_to_24(mbIndex) + "0500" + IntToHex_1_to_24(lockIndex) + "FF00";
            //LRC
            int sum = 0;
            for (int i = 0; i < command.Length / 2; i++)
            {
                string val = command.Substring(i * 2, 2);
                sum += int.Parse(val, System.Globalization.NumberStyles.HexNumber);
            }
            byte result = (byte)((~sum) + 1);
            command += result.ToString("X2");
            command = ((char)0x3A).ToString() + command + ((char)0x0D).ToString() + ((char)0x0A).ToString();
            byte[] buffer = Encoding.ASCII.GetBytes(command);
            try
            {
                this.serialPort.Write(command);
            }
            finally
            {
                string hex_cmd = string.Empty;
                foreach (byte b in buffer)
                {
                    hex_cmd += Convert.ToString(b, 16).ToUpper().PadLeft(2, '0');
                }
                Com.DataCool.DotNetExpand.LogHelper.Info(command + "," + hex_cmd);
                if (!CurrCommandList.Contains(hex_cmd))
                    CurrCommandList.Add(hex_cmd);
            }
        }

不用意思以前的代码没有调试过,误导你了。你看看这段代码。写串口的是十六进制的字符 ,像你这样只需要把“H”去掉就直接发给串口就行了。serialPort.Write(“H23H33H30H47H45”.Replace("H",""));

数据酷软件 | 园豆:130 (初学一级) | 2017-12-27 17:01

command = ((char)0x3A).ToString() + command + ((char)0x0D).ToString() + ((char)0x0A).ToString();
            byte[] buffer = Encoding.ASCII.GetBytes(command);

这就是十六进制转成byte[],发的时候只能发字符,所以用dudu写的 serialPort1.Write(Encoding.UTF8.GetString(buffer));

支持(0) 反对(0) 数据酷软件 | 园豆:130 (初学一级) | 2017-12-27 17:21

好的,谢谢你

支持(0) 反对(0) 绿绿山水 | 园豆:248 (菜鸟二级) | 2017-12-27 17:41
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册