-2

我能够修改 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; 
} 

我想提供这个问题的更新。设备在新年期间运行了几天后,我能够完全确认 Brad 发布的代码解决方案完全符合我们的需要。

我能够确认我的怀疑,即预期值确实是二进制编码的十进制,我能够确认预期值仅适用于具有 HEX 值。一位同事能够独立确认时间和日期,使用表格作为标准,所以我觉得把它放在床上很舒服。

我能够确认无论出于何种原因,数据的十进制值不起作用,我只能得出结论,设备正在以十六进制值发送数据,我唯一担心的是其他应用程序是否会以类似的方法工作。

感谢大家帮助我解决这个问题,一些评论让我走上了一条让我弄清楚的道路。

4

3 回答 3

3

好吧,即使这些数字似乎没有意义,这就是我想出的(给出你所期望的结果(来自提供的示例)。把这个通过榨汁机,看看它是否与所有您期望的结果:

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;
}

我真的只是在黑暗中开枪,因为你给出的数字不是我所说的典型数字。话虽如此,你必须让你收到的东西工作,所以:耸耸肩:。

于 2010-12-30T15:52:54.173 回答
1

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

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

但是,如果您说 2010 年希望达到 200A,我真的不明白您想要达到什么目标。

于 2010-12-30T14:58:20.827 回答
0

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

正常将是其中之一:

  • 2010 => 0x07DA
    • 完整的十六进制
  • 2010 => 0x140A
    • 数字中途中断,每个部分都是十六进制
  • 2010 => 0x2010
    • bcd 编码为在 wikipedia 上找到(其他地方);-)

经过一番谷歌搜索和思考,这是我的第一个想法:

  • 将所有内容放入BinaryReader中。
  • 通过调用BinaryReader.ReadByte()单独获取所有值并将其转换为 int
  • 首先将每个值乘以 10,然后除以 16
  • 将所有这些单独的值放入一个List<int>
  • 用于Math.Pow(value, 10 * (List.Count - indexOfValue))聚合所有这些值
于 2010-12-30T14:54:55.507 回答