Pregunta

Yo era capaz de modificar la solución aportada por Brad Christie para obtener los resultados que estoy esperando para las horas, minutos, segundos, meses, días, años y todos los cuales están en formato 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; 
} 

quería ofrecer una actualización a esta pregunta. Después de que el dispositivo se ejecuta durante varios días a través de Año Nuevo, pude confirmar que la completa solución de código Brad publicada hace exactamente lo que va a necesitar.

pude confirmar mis sospechas de que el valor esperado era de hecho un codificado en binario Decmial, pude confirmar que el valor esperado sólo funciona tiene un valor hexadecimal. Un compañero de trabajo pudo confirmar de forma independiente la hora y la fecha, el uso de la tabla de la norma, por lo que me siento cómodo poniendo esto a la cama.

pude confirmar que por cualquier razón el valor decmial de los datos no funciona, sólo puedo concluir que los datos están siendo enviados como un valor hexadecimal por el dispositivo, mi única preocupación es van a otras aplicaciones de trabajo en una situación similar método.

aprecio la ayuda de todos los miembros de calcular esto, algunos de los comentarios que me llevan por un camino que me permiten averiguar.

¿Fue útil?

Solución

Bueno, a pesar de que los números no parecen tener sentido, esto es lo que ocurrió con (dando los resultados Esta esperando (a partir de los ejemplos proporcionados). Tome este a través de la escurridor y ver si sale con todos los resultados que usted está esperando:

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

estoy realmente sólo toma un tiro en la oscuridad a esto como los números que diste no son lo que yo llamaría típico. Una vez dicho esto, hay que hacer lo que está recibiendo el trabajo, por lo que: encogimiento de hombros:.

Otros consejos

Si desea convertir el número hexadecimal a la representación sólo tiene que utilizar ToString con "x" como parámetro:

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

Sin embargo, yo no entiendo muy bien lo que se quiere lograr si usted dice que para el año 2010, se espera 200A.

¿Está realmente seguro de que su ejemplo es correcta? ¿Por qué tiene un hexágono-serie, donde la primera parte es la base 10 y la segunda parte es la base 16?

Normal lo haría uno de los siguientes:

  • 2010 => 0x07DA
    • hexagonal completa
  • 2010 => 0x140A
    • el número se rompe a mitad de camino y cada parte es hex
  • 2010 => 0x2010
    • BCD codificado como se encuentra en wikipedia (donde los demás); -)

Después de algunas google y pensando que aquí es mi primera idea:

  • Poner todo en un BinaryReader .
  • Obtener todos los valores de forma individual fuera de él llamando BinaryReader .ReadByte () y echarlo a un int
  • Multiplicar cada valor por primera vez por 10, a continuación dividir por 16
  • poner todo esto los valores individuales en un List<int>
  • Uso Math.Pow(value, 10 * (List.Count - indexOfValue)) a agregarse todos estos valores
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top