以下是乱码,
socket中用16进制发送时间,正确方式是怎样呢?
byte[] data = new byte[4];
long ts = (uint)(DateTime.Now.Ticks / 10000);
System.Array.Copy(System.BitConverter.GetBytes(ts), 0, data, 0, sizeof(uint));
socketTCP.SendData(data);
/// <summary>
/// 把一个时间转化成四个字节的16进制字符串
/// </summary>
/// <param name="time">要转化的时间</param>
/// <returns></returns>
public static String TimeToHex(DateTime time)
{
StringBuilder sb = new StringBuilder();
DateTime timeStar = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime (1970,01,01));
TimeSpan timeSpan= time - timeStar;
uint unitSpan= Convert.ToUInt32(timeSpan.TotalSeconds);
if (unitSpan<0)
{
return sb.ToString();
}
byte[] bytes = System.BitConverter.GetBytes(unitSpan);
for (int i = bytes.Length-1; i >= 0; i--)
{
sb.Append(bytes[i].ToString("X2"));
}
return sb.ToString();
}
分成 yy yy MM dd HH mm ss 7个字节发送试试。
最简单就是一个一个的转换:
socketTCP.SendData(
data[0].ToString("X2") +
data[1].ToString("X2") +
data[2].ToString("X2") +
data[3].ToString("X2"));
找到了这样的代码。。。
/// 把十六进制数据转化成时间
/// </summary>
/// <param name="HexStr">16进制数据字符串</param>
/// <returns></returns>
public static DateTime HexToTime(string HexStr)
{
HexStr = HexStr.Replace(" ", "");
DateTime time = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970,01,01));
if (HexStr.StartsWith("oX")||HexStr.StartsWith("OX"))
{
HexStr = HexStr.Substring(2, HexStr.Length - 2);
}
if (HexStr.Length%2!=0)
{
HexStr += " ";
}
byte[] bytes=new byte[HexStr.Length/2];
for (int i = 0; i < bytes.Length; i++)
{
bytes[bytes.Length-1-i] = Convert.ToByte(HexStr.Substring(i * 2, 2), 16);
}
uint unitSpan = System.BitConverter.ToUInt32(bytes, 0);
return time.AddSeconds(unitSpan);
}