Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 字节数组转换混乱_C#_Arrays_Serial Port - Fatal编程技术网

C# 字节数组转换混乱

C# 字节数组转换混乱,c#,arrays,serial-port,C#,Arrays,Serial Port,我正在读取一个串行端口并从中获取一个字节数组 看起来是这样的: 我相信数据是正确的,因为我运行它的时候是2018年8月7日8:03 每个字节都是表示部分日期的值。以下是文件: 它在控制台上检索当前时间和日期。数据被发送进来 二进制格式。格式与SETTIME命令相同。 示例(华帝于1998年1月28日上午5:17:42回复): “GETTIME”< 我需要分别转换每个字节,以便能够得到它的值进行解析。我试过这个: SerialPort sp = (SerialPort)sender;

我正在读取一个串行端口并从中获取一个字节数组

看起来是这样的:

我相信数据是正确的,因为我运行它的时候是2018年8月7日8:03

每个字节都是表示部分日期的值。以下是文件:

它在控制台上检索当前时间和日期。数据被发送进来 二进制格式。格式与SETTIME命令相同。 示例(华帝于1998年1月28日上午5:17:42回复):

“GETTIME”<

我需要分别转换每个字节,以便能够得到它的值进行解析。我试过这个:

    SerialPort sp = (SerialPort)sender;
    int length = sp.BytesToRead;
    byte[] buf = new byte[length];
    sp.Read(buf, 0, length);
    var newarray = BitConverter.ToInt16(buf, 0);
但这会将其转换为
13574


我做错了什么?

没有必要转换字节;您可以直接使用它们来创建新的
DateTime
对象:

var time = new DateTime(1900 + buf[6], buf[5], buf[4], buf[3], buf[2], buf[1]);

不需要转换字节;您可以直接使用它们来创建新的
DateTime
对象:

var time = new DateTime(1900 + buf[6], buf[5], buf[4], buf[3], buf[2], buf[1]);

因为转换后您的问题不包含所需的数据类型,所以我使用DateTime作为数据类型,以便以后可以更轻松地处理它

SerialPort sp = (SerialPort)sender;
int length = sp.BytesToRead;
byte[] buf = new byte[length];
sp.Read(buf, 0, length);
DateTime newDate = new DateTime(1900 + buf[6], buf[5], buf[4], buf[3], buf[2], buf[1]);

因为转换后您的问题不包含所需的数据类型,所以我使用DateTime作为数据类型,以便以后可以更轻松地处理它

SerialPort sp = (SerialPort)sender;
int length = sp.BytesToRead;
byte[] buf = new byte[length];
sp.Read(buf, 0, length);
DateTime newDate = new DateTime(1900 + buf[6], buf[5], buf[4], buf[3], buf[2], buf[1]);

@它是指时间中的秒数。索引0是ACK。您不应该将字节数组转换为
Int16
数组,但除此之外,它看起来不正确。规范规定一个日期应该有8个字节,但数组显示9个字节。此外,根据规范,您提供的日期时间与字节数组不匹配(它应该是
sec min hour day month year
,但您的数字与此模式不匹配)。您确定这个来自串行端口的输入实际上代表了日期数据吗?看起来应该是这样的:
var time=new DateTime(1900+buf[6],buf[5],buf[4],buf[3],buf[2],buf[1])@Abion47这是一个很好的观点。我会和开发人员联系,看看数据是怎么回事。@itsme86我找到了。机器的所有响应前面都有一个代表响应类型的ASCII字符字节<代码>0x06
映射到成功的确认响应。谜团解开了。@itsme86是时间的秒数。索引0是ACK。您不应该将字节数组转换为
Int16
数组,但除此之外,它看起来不正确。规范规定一个日期应该有8个字节,但数组显示9个字节。此外,根据规范,您提供的日期时间与字节数组不匹配(它应该是
sec min hour day month year
,但您的数字与此模式不匹配)。您确定这个来自串行端口的输入实际上代表了日期数据吗?看起来应该是这样的:
var time=new DateTime(1900+buf[6],buf[5],buf[4],buf[3],buf[2],buf[1])@Abion47这是一个很好的观点。我会和开发人员联系,看看数据是怎么回事。@itsme86我找到了。机器的所有响应前面都有一个代表响应类型的ASCII字符字节<代码>0x06
映射到成功的确认响应。谜团解开了。谢谢你的帮助!谢谢你的帮助!