C# BCD十六进制字符串到整数

C# BCD十六进制字符串到整数,c#,.net,numbers,bcd,C#,.net,Numbers,Bcd,我能够修改Brad Christie提供的解决方案,以获得我期望的小时、分钟、秒、月、日和年的结果,所有这些都是BCD格式: static Int32 GetYearFromBCD(Int32 time) { int length = time.ToString().Length -1; List<Int32> YearList = new List<Int32>(); for (Int32 i = length; i >= 0; i --) { Int3

我能够修改Brad Christie提供的解决方案,以获得我期望的小时、分钟、秒、月、日和年的结果,所有这些都是BCD格式:

static Int32 GetYearFromBCD(Int32 time) 
{ 
int length = time.ToString().Length -1;
List<Int32> YearList = new List<Int32>(); 
for (Int32 i = length; i >= 0; i --) 
{ 
Int32 place = i * 4; 
Int32 val = 0x01 << place; 

Int32 curVal = (Int32)(time / val); 
if (curVal > 9 && YearList.Count > 0) 
{ 
Int32 delta = (Int32)(curVal / 10); 
YearList[YearList.Count - 1] += delta; 
curVal -= delta * 10; 
} 
YearList.Add(curVal); 
time -= curVal << place; 
} 
Int32 Year = 0; 
for (Int32 y = 0; y < YearList.Count; y++) 
Year += YearList[y] * (Int32)Math.Pow(10,(length+1 - y)-1); 
return Year; 
} 
静态Int32 GetYearFromBCD(Int32时间)
{ 
int length=time.ToString().length-1;
列表年表=新列表();
对于(Int32 i=length;i>=0;i--)
{ 
Int32位置=i*4;
Int32 val=0x01 9&&YearList.Count>0)
{ 
Int32δ=(Int32)(曲线/10);
YearList[YearList.Count-1]+=delta;
曲线-=δ*10;
} 
年鉴。添加(曲线);

time-=curVal你真的确定你的例子是正确的吗?为什么你有一个十六进制数,其中第一部分以10为基数,第二部分以16为基数

正常情况下,以下情况之一:

  • 2010=>0x07DA
    • 完全十六进制
  • 2010=>0x140A
    • 数字被打断一半,每个部分都是十六进制
  • 2010=>0x2010
    • 维基百科上的bcd编码(其他地方);-)
在谷歌搜索和思考之后,我的第一个想法是:

  • 把所有的东西都放进一个盒子里
  • 通过调用并将其强制转换为int,分别从中获取所有值
  • 先将每个值乘以10,然后除以16
  • 将所有这些单独的值放入
    列表中
  • 使用
    Math.Pow(value,10*(List.Count-indexOfValue))
    聚合所有这些值

如果要将数字转换为十六进制表示,只需使用带有“x”参数的ToString:

2010.ToString("x")  output: "7da"

然而,如果你说2010年是200A,我真的不明白你想要实现什么。

好吧,尽管这些数字似乎没有意义,但这就是我想到的(给出了你期望的结果(从提供的示例中).仔细检查一下,看看结果是否符合你的预期:

static Int32 GetYearFromBCD(Int32 time)
{
    List<Int32> YearList = new List<Int32>();
    for (Int32 i = 3; i >= 0; i --)
    {
        Int32 place = i * 4;
        Int32 val = 0x01 << place;

        Int32 curVal = (Int32)(time / val);
        if (curVal > 9 && YearList.Count > 0)
        {
            Int32 delta = (Int32)(curVal / 10);
            YearList[YearList.Count - 1] += delta;
            curVal -= delta * 10;
        }
        YearList.Add(curVal);
        time -= curVal << place;
    }
    Int32 Year = 0;
    for (Int32 y = 0; y < 4; y++)
        Year += YearList[y] * (Int32)Math.Pow(10,(4 - y)-1);
    return Year;
}
静态Int32 GetYearFromBCD(Int32时间)
{
列表年表=新列表();
对于(Int32 i=3;i>=0;i--)
{
Int32位置=i*4;
Int32 val=0x01 9&&YearList.Count>0)
{
Int32δ=(Int32)(曲线/10);
YearList[YearList.Count-1]+=delta;
曲线-=δ*10;
}
年鉴。添加(曲线);

时间-=曲线在BCD中也不是
0x200A
,而是
0x2010
。那么你的文档是在撒谎。正如我们一直说的,2010年的BCD是
0x2010
。要么你的文档在日期格式上有错误,要么是实现中存在生成非BCD值的错误。错误非常明显。T嘿,以
0x2000
为基础,加上世纪年。这对
0x2000
0x2009
有效,但在
0x2010
上失败,取而代之的是
0x200A
。嘿,你是为不正确的文档辩护的人。我只是为差异提供了一个可能的解释。;)我再次向你推荐我的先前的断言:“您的文档(声明数据为BCD格式)不正确。”