c#数据转换,感觉有点难度

qian21h 2008-08-28 01:04:34
       byte[] dataByte =new byte[10] ;
int xinDao = Int32.Parse(numericUpDown1.Value.ToString());
int wsnId = Int32.Parse(numericUpDown2.Value.ToString());
int wsnFid = Int32.Parse(numericUpDown3.Value.ToString());
int wsnChildNum = Int32.Parse(numericUpDown4.Value.ToString());
Int32 slpTime =Int32.Parse( numericUpDown5.Value.ToString());
dataByte[0] = 0X2B;
dataByte[1] = 0X2B;
dataByte[2] = 0X2B;
dataByte[3] =Convert.ToByte( xinDao);
dataByte[4] = Convert.ToByte(wsnId);
dataByte[5] = Convert.ToByte(wsnFid);
dataByte[6] = Convert.ToByte(wsnChildNum);
dataByte[7] = Convert.ToByte(slpTime);
dataByte[8] = Convert.ToByte(slpTime);
dataByte[9] = Convert.ToByte(slpTime);
serialPort1.Write(dataByte, 0, 10);

前面的数据
dataByte[0] = 0X2B;
dataByte[1] = 0X2B;
dataByte[2] = 0X2B;
dataByte[3] =Convert.ToByte( xinDao);
dataByte[4] = Convert.ToByte(wsnId);
dataByte[5] = Convert.ToByte(wsnFid);
dataByte[6] = Convert.ToByte(wsnChildNum);
没问题
关键是slpTime 这个数据,比如slpTime =600
那么我要先把600转换成16进制的,600的16进制数是258,然后还要把258分成:00 02 58分别存到dataByte[7],dataByte[8],dataByte[9]
是不是有点难度啊
...全文
242 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
qian21h 2008-08-29
  • 打赏
  • 举报
回复
o(∩_∩)o...,我们的仪表只要三个字节哈
lude8880 2008-08-28
  • 打赏
  • 举报
回复
蹭分
soaringbird 2008-08-28
  • 打赏
  • 举报
回复
[Quote=引用楼主 qian21h 的帖子:]
600的16进制数是258,然后还要把258分成:00 02 58分别存到dataByte[7],dataByte[8],dataByte[9]
[/Quote]

四个字节的整数用三个字节存,这协议订的,省那一个字节干嘛呀,处理起来很麻烦
lycarpy 2008-08-28
  • 打赏
  • 举报
回复
帮顶
flyingfz 2008-08-28
  • 打赏
  • 举报
回复
mark
GhostAdai 2008-08-28
  • 打赏
  • 举报
回复
路过接分
wdgphc 2008-08-28
  • 打赏
  • 举报
回复
错了.

byte[] b = BitConverter.GetBytes(slpTime );
dataByte[7] = b[2];
dataByte[8] = b[1];
dataByte[9] = b[0];
wdgphc 2008-08-28
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 qian21h 的回复:]

Array.Copy( BitConverter.GetBytes(slpTime ), 0, dataByte, 7, 3);
如何把值附值到dataByte[7], dataByte[8],dataByte[9]去呢
[/Quote]


数组copy啊.就=以下.

byte[] b = BitConverter.GetBytes(slpTime );
dataByte[7] = b[1];
dataByte[8] = b[2];
dataByte[9] = b[3];
qian21h 2008-08-28
  • 打赏
  • 举报
回复
用你的方法可以解决,非常感谢
qian21h 2008-08-28
  • 打赏
  • 举报
回复

Array.Copy( BitConverter.GetBytes(slpTime ), 0, dataByte, 7, 3);
如何把值附值到dataByte[7], dataByte[8],dataByte[9]去呢
wdgphc 2008-08-28
  • 打赏
  • 举报
回复
int slpTime =600;
string s = slpTime.ToString("X").PadLeft(6, '0');
dataByte[7] = (byte)Convert.ToInt32(s.Substring(0, 2),16);
dataByte[8] = (byte)Convert.ToInt32(s.Substring(2, 2),16);
dataByte[9] = (byte)Convert.ToInt32(s.Substring(4, 2),16);

slpTime的值变化后面也跟着变啊,但是方法没有楼上的好.楼上的不是unsafe的吧.
wdgphc 2008-08-28
  • 打赏
  • 举报
回复
忘了

Array.Copy( BitConverter.GetBytes(slpTime ), 0, dataByte, 7, 3);

但是执行完了把 dataByte[7] 和 [9] 交换一下.


还是gomoku对.
qian21h 2008-08-28
  • 打赏
  • 举报
回复
gomoku
这个函数使用了unsafe标记,编译时要加上unsafe参数哪里修改
qian21h 2008-08-28
  • 打赏
  • 举报
回复
gomoku
这个函数使用了unsafe标记,编译时要加上unsafe参数哪里修改
qian21h 2008-08-28
  • 打赏
  • 举报
回复
wdgphc
你的这个好像只能是600哦
还有我的00 02 58
你把这个已经转换的数据又转换了一遍呢
你把58转成3A了
baihe_591 2008-08-28
  • 打赏
  • 举报
回复
学习.
gomoku 2008-08-28
  • 打赏
  • 举报
回复
1. design your communication so an integer will have a fixed length of 4 bytes. use 3 bytes to pass an integer is a bad idea.

2. you can copy an integer to an array using BitConverter:

Array.Copy( BitConverter.GetBytes(slpTime ), 0, dataByte, 7, 4);



这个函数转换后的形成一个byte[4],后三个字节应该就是你所需要的。这个函数使用了unsafe标记,编译时要加上unsafe参数
By the way, .Net uses Little-Endian, you should use the first three bytes.



OOQQOO 2008-08-28
  • 打赏
  • 举报
回复
up
wdgphc 2008-08-28
  • 打赏
  • 举报
回复
int slpTime =600;
string s = slpTime.ToString("X").PadLeft(6, '0');
dataByte[7] = Convert.ToByte(s.Substring(0, 2));
dataByte[8] = Convert.ToByte(s.Substring(2, 2));
dataByte[9] = Convert.ToByte(s.Substring(4, 2));
kbryant 2008-08-28
  • 打赏
  • 举报
回复
帮顶~
加载更多回复(4)

110,529

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧