C# 将日期编码为ulong以便与AmiBroker一起使用

C# 将日期编码为ulong以便与AmiBroker一起使用,c#,.net,datetime,bit-manipulation,C#,.net,Datetime,Bit Manipulation,我正在使用来自的非官方C#sdk为Amibroker开发一个数据插件。它所做的是读取一个文本文件,将内容解析为amibroker的数据库格式,以便数据可以显示为图形。以下是输入数据的示例: 2012.07.09 01:35:2712763,1 2012.07.09 01:35:5012762,1 2012.07.09 01:36:4312761,1 2012.07.09 01:37:1012760,1 2012.07.09 01:37:4412761,1 格式为日期/时间、关闭、卷 输出的一个示

我正在使用来自的非官方C#sdk为Amibroker开发一个数据插件。它所做的是读取一个文本文件,将内容解析为amibroker的数据库格式,以便数据可以显示为图形。以下是输入数据的示例:

2012.07.09 01:35:2712763,1
2012.07.09 01:35:5012762,1
2012.07.09 01:36:4312761,1
2012.07.09 01:37:1012760,1
2012.07.09 01:37:4412761,1

格式为日期/时间、关闭、卷

输出的一个示例是(如何解析上述5行):

2012/07/09 01:35 12763 1
2083/08/22 12762 1
2083/08/22 12761 1
2012/07/09 01:37 12760 1
2083/08/22 12761 1

正如你所看到的,有些日期是正确的,有些日期是2083/08/22。这是怎么发生的,因为所有的输入日期都是相同的格式

在c#dll中,我用于导入的代码是:

unsafe public static int GetQuotesEx(string ticker, Periodicity periodicity, int lastValid, int size, Quotation* quotes, GQEContext* context)
    {

        string fileName = "C:\\" + ticker + ".txt";

        System.IO.StreamReader objReader;
        objReader = new System.IO.StreamReader(fileName);
        int i = 0;
        string line = "";

        while((line = objReader.ReadLine()) != null && i < size)
        {
            string[] splitLine = line.Split(',');
            DateTime   dt = Convert.ToDateTime(splitLine[0]);
            float bidprice = float.Parse(splitLine[1]);
            float volume = float.Parse(splitLine[2]);

            quotes[i].DateTime = PackDate(dt);
            quotes[i].Price = bidprice;
            quotes[i].Open = bidprice;
            quotes[i].High = bidprice;
            quotes[i].Low = bidprice;
            quotes[i].Volume = volume;
            i++;
        }

        return i;
    }
不安全的公共静态int-GetQuotesEx(字符串标记器、周期性周期、int-lastValid、int-size、引号*引号、GQEContext*上下文)
{
字符串fileName=“C:\\”+ticker+“.txt”;
System.IO.StreamReader objReader;
objReader=new System.IO.StreamReader(文件名);
int i=0;
字符串行=”;
while((line=objReader.ReadLine())!=null&&i
和PackDate函数代码(我没有写这个,它在dll中):

//
///将AmiBroker DateTime对象打包到UInt64中
/// 
静态ulong打包日期(日期时间日期)
{
返回包装日期(日期,假);
}
/// 
///将AmiBroker DateTime对象打包到UInt64中
/// 
静态ulong PackDate(日期时间日期,bool isFeaturePad)
{
var isood=date.Hour==0&&date.Minute==0&&date.Second==0;
//低32位
var ft=BitVector32.CreateSection(1);
var rs=BitVector32.CreateSection(23英尺);
var ms=BitVector32.CreateSection(999,rs);
var ml=BitVector32.CreateSection(999,ms);
var sc=BitVector32.CreateSection(59,ml);
var bv1=新的位向量32(0);
bv1[ft]=isFeaturePad?1:0;//位标记“未来数据”
bv1[rs]=0;//保留设置为零
bv1[ms]=0;//微秒0..999
bv1[ml]=日期.毫秒;//毫秒0..999
bv1[sc]=date.Second;//0..59
//高32位
var mi=BitVector32.CreateSection(59);
var hr=BitVector32.CreateSection(23,mi);
var dy=BitVector32.CreateSection(31,hr);
var mn=BitVector32.CreateSection(12,dy);
var yr=BitVector32.CreateSection(4095,mn);
var bv2=新的位向量32(0);
bv2[mi]=isEOD?63:date.Minute;//0..59 63保留为EOD标记
bv2[hr]=isEOD?31:date.Hour;//0..23 31保留为EOD标记
bv2[dy]=日期.天;//1..31
bv2[mn]=日期.月份;//1..12
bv2[yr]=date.Year;//0..4095

返回((ulong)bv2.数据问题与
PackDate
有关-所有
bv1
的32位都用于存储时间,并在
bv1中强制转换整数值。由于int的MSB被用作符号,因此在填充
bv1
的第一位时,数据
直接指向
ulong
会导致溢出

以下是
PackDate
编码到bv1中的内容:

Name | Max size (decimal) | Bits required
ft   |   1                |  1
rs   |  23                |  5
ms   | 999                | 10
ml   | 999                | 10
sc   |  59                |  6
====================================
TOTAL                       32
由于“秒”字段占用最高有效位,因此秒数超过31的任何日期都会发生溢出

为防止溢出,需要将
PackDate
的最后一行更改为:

return ((ulong)(uint)bv2.Data << 32) ^ (uint)bv1.Data;

返回((ulong)(uint)bv2.数据问题与
PackDate
有关-所有
bv1
的32位都用于存储时间,并在
bv1中强制转换整数值。由于int的MSB被用作符号,因此在填充
bv1
的第一位时,数据
直接指向
ulong
会导致溢出

以下是
PackDate
编码到bv1中的内容:

Name | Max size (decimal) | Bits required
ft   |   1                |  1
rs   |  23                |  5
ms   | 999                | 10
ml   | 999                | 10
sc   |  59                |  6
====================================
TOTAL                       32
由于“秒”字段占用最高有效位,因此秒数超过31的任何日期都会发生溢出

为防止溢出,需要将
PackDate
的最后一行更改为:

return ((ulong)(uint)bv2.Data << 32) ^ (uint)bv1.Data;

return((ulong)(uint)bv2.Data非常感谢你!你帮了我这么多!它起作用了。我试着给它打上标记,显然我没有足够的声誉来这么做+1000。不用担心,@user1581495。这是一个好问题!即使你没有声誉去投票,你仍然可以把我的答案标记为…你能建议怎么做吗“打开行李"同样的?例如,ulong to DateTime?你好@Nikki,你也可以使用
BitVector32
来解包-只需根据问题创建部分,读出它们的值,而不是写信给它们。非常感谢你!你帮了我这么多!成功了。我试着做了标记,显然我没有足够的声誉来做+1000。没有是的,@user1581495。这是一个很好的问题!即使你没有提高投票的声望,你仍然可以把我的答案标记为……你能建议如何“解包”相同的答案吗?例如,从ulong到DateTime?嗨@Nikki,你可以使用
BitVe