Question

j'ai pu modifier la solution fournie par Brad Christie pour obtenir les résultats que je attends pour les heures, minutes, secondes, mois, jours et les années qui sont tous au format 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; 
} 

Je voulais une mise à jour à cette question. Une fois l'appareil fonctionnait pendant plusieurs jours par le Nouvel An, je suis en mesure de confirmer que la solution complète de code Brad affiché fait exactement ce que nous aura besoin.

Je suis en mesure de confirmer mes soupçons que la valeur attendue était en effet un Binary Coded Decmial, je suis en mesure de confirmer que la valeur attendue ne fonctionne que a une valeur HEX. Un collègue a pu confirmer de manière indépendante l'heure et la date, en utilisant le tableau de la norme, donc je me sens à l'aise de mettre cela au lit.

Je suis en mesure de confirmer que, pour une raison quelconque la valeur decmial des données ne fonctionne pas, je ne peux conclure que les données sont envoyées en tant que valeur hexadécimale par le dispositif, mon seul souci est ce que d'autres applications travailler dans un même méthode.

Je vous remercie de l'aide de tout le monde en essayant de se faire, certains commentaires me conduisent sur un chemin qui me permettent de comprendre.

Était-ce utile?

La solution

Eh bien, même si les chiffres ne semblent pas donner un sens, ce que je suis venu avec (ce qui donne des résultats Vous êtes attendre (des exemples fournis). Prenez ce à travers la essoreuse et voir si elle vient avec tous les résultats que vous attendez:

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

Je suis vraiment juste prendre un coup dans l'obscurité à ce que les chiffres que vous avez données ne sont pas ce que je qualifierais typique. Cela dit, vous devez faire ce que vous recevez travail, donc: haussant les épaules.

Autres conseils

Si vous voulez convertir un nombre à la représentation hexagonale il suffit d'utiliser ToString avec « x » comme param:

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

Cependant, je ne comprends pas vraiment ce que vous voulez atteindre si vous dites que pour 2010, vous vous attendez 200A.

Êtes-vous vraiment sûr que votre exemple est correct? Pourquoi avez-vous un numéro hexadécimal, où la première partie est avec la base 10 et la seconde partie est base 16?

Normal serait l'un de ces derniers:

  • 2010 => 0x07DA
    • hex complet
  • 2010 => 0x140A
    • le nombre est rompu à mi-chemin, et chaque pièce est hex
  • 2010 => 0x2010
    • Bcd codé que l'on trouve sur wikipedia (où d'autre); -)

Après quelques googler et de la pensée ici est ma première idée:

  • Mettez tout en BinaryReader .
  • Obtenir toutes les valeurs individuellement de celui-ci en appelant BinaryReader .ReadByte () et de le jeter à un int
  • multiplier chaque première valeur de 10, puis diviser par 16
  • Mettez toutes ces valeurs individuelles dans un List<int>
  • utilisation Math.Pow(value, 10 * (List.Count - indexOfValue)) pour agréger toutes ces valeurs
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top