前言:因为时间戳是从java端传到C#端,通过socket传输,所以java端将长度为13的长整型时间戳转成字节数组(长度为8)进行传输,在C#端接收后,需要将字节数组转成长整型,并转化为时间,方便查看。 其中比较容易出错的地方是,C#端字节数组转成长整型,如果用C#中的方法是不行的(bytes转成int64),所以我直接把java的节数组转成长整型的方法,改成C#使用,发现可以正常转换。
一、java long转bytes或bytes转long,如下:
1)long to bytes
public static byte[] longToBytes(long values) {
byte[] buffer = new byte[8];
for (int i = 0; i < 8; i++) {
int offset = 64 - (i + 1) * 8;
buffer[i] = (byte) ((values >> offset) & 0xff);
}
return buffer;
}
2) bytes to long
public static long bytesToLong(byte[] buffer) {
if (buffer == null || buffer.length < 8)
return 0;
long values = 0;
for (int i = 0; i < 8; i++) {
values <<= 8;
values|= (buffer[i] & 0xff);
}
return values;
}
二、C# bytes转long,实际上就是java端的方法,改改类型即可,如下:
// 将从socket接收到的java时间戳字节数组(8字节)转成long,实际上就是java上的方法改改
public long TimestampBytesToLong(byte[] buffer)
{
if (buffer == null || buffer.Length < 8)
return 0;
long values = 0;
for (int i = 0; i < 8; i++)
{
values <<= 8;
values |= buffer[i] & 0xff;
}
return values;
}
三、C# long转时间,代码如下:
private string GetTimestampFromJavaTime(long javaTime)
{
Console.WriteLine("GetTimestampFromJavaTime javaTime=" + javaTime);
try
{
DateTime time = DateTime.Now;
//time = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1)).AddSeconds(double.Parse(value));
DateTime dt_1970 = new DateTime(1970, 1, 1);
long tricks_1970 = dt_1970.Ticks;//1970年1月1日刻度
long time_tricks = tricks_1970 + (javaTime * 10000);//日志日期刻度
time = new DateTime(time_tricks);//转化为DateTime
return time.ToLocalTime().ToString("yyyy/MM/dd HH:mm:ss.fff");//转为本地时区
}
catch (Exception e)
{
Console.WriteLine("GetTimestampFromJavaTime javaTime e =" + e.Message);
}
return "";
}