嗨,哈喽
我现在有一组16进制数组:H23H33H30H47H45
要把这组数据转为byte []
代码怎么写的,我自己想着是不是如下的写法:
string[] hex = "H23H33H30H47H45";
string[] hex = convert.Tobyte[5]();
我知道我写的代码是错的,但是我的想法就是这个样子的,思路就是这样。
还请懂的朋友们嗮嗮你们正确的代码来,怎么转化为byte[]数组的?
我之前一位好朋友写的,我看不懂,只是他最近太忙,不好意思打扰他。
所以来这里寻找下正确 的写法。
是将16进制字符串转换为byte数组?还是将byte数组中的16进制转换为2进制?
var bytes = new Byte[] { 0x23, 0x33, 0x30, 0x47, 0x45 };
您好
是将16进制转换为byte[]数组。
代码写出来了,但是报如下错误:
@绿绿山水: 如果这些16进制是字符编码的话,可以这样:
var bytes = new Byte[] { 0x23, 0x33, 0x30, 0x47, 0x45 };
Console.WriteLine(Encoding.UTF8.GetString(bytes)); //Output is #30GE
@dudu: 我是要通过serialport组件发送到串口的,如果使用sonsole.write(),只是写进控制台,这不是我想要的。我的目的只有1 个,把byte[]数组的参数传输到串口。
@绿绿山水:
serialPort1.Write(Encoding.UTF8.GetString(bytes));
@dudu: 报错是没有了。但是这句话应该怎么理解呢?
serialPort.write() 这个我是知道的。
就是下面这个Encoding.UTF8.Getstring(bytes)
1)这句什么意思,怎么理解?
2)要获取bytes,必须得用utf8 格式? 为什么? UTF8跟这些16进制以及bytes 有什么关系?为什么要牵涉到UTF8?
@绿绿山水: bytes中保存的是字符编码
@dudu: 谢谢你
@dudu: 你看楼上写的代码,牵涉到2个单词,一个是GetBuffer,一个 是buffer ,可否对这2个词进行解释一下,因为我已经无数次见到这2个词了,到底有何特殊之处,让你楼上楼下的朋友们写代码都出现了这2个词,干什么用的 ?不仅仅是作为变量名来用的吧?
16进制,里面没有H。
你是H分割吧。先分割,然后转,不知道你的23,33是什么进制,如果是10进制,直接转byte
如果是16进制,先转10进制,再转byte。然后存入一个byte集合就ok.
把具体代码写出来吧。你的大概意思我是明白了。23 和33是16进制。
按照你的思路把具体代码写出来。思路我懂,就是不会写代码哈,哈哈。
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;
}
拿去参考。
大师,首先谢谢你,你的境界,我目前还达不到。所以我要问一些基本的问题。
1)第一句的GetBuffer 是个什么意思?为什么要用Buffer? Buffer 在这里是缓存区的意思吧?
@绿绿山水: 第二个函数直接用
@花飘水流兮: 第2个函数直接用?指的是哪个函数直接用?
我想知道为什么要用buffer? 什么情况下要用到buffer?
@绿绿山水:
StringToBytes:"H23H33H30H47H45".GetBytesFromHexString();
BytesToString:bytes.GetBufferHexString();
比如你想记下,向串口写了什么,bytes.GetBufferHexString();
@花飘水流兮: 可否解释下buffer? GetBuffer? 这2个东西(buffer,GetBuffer)我见过无数次了,就是不理解,不知道这2个到底是什么玩意。什么意思,这让我十分苦恼。看到很熟悉,就是不知道什么意思,干什么用的?
@绿绿山水: buffer是缓冲存储区
an area in a computer's memory where data can be stored for a short time
/// <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",""));
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));
好的,谢谢你