Frage

Ich konnte die von Brad Christie bereitgestellte Lösung ändern, um die Ergebnisse zu erzielen, die ich für die Stunden, Minuten, Sekunden, Monate, Tage und Jahre erwarte, die alle im BCD -Format sind:

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

Ich wollte ein Update für diese Frage bereitstellen. Nachdem das Gerät mehrere Tage lang in Neujahr ausgeführt wurde, konnte ich bestätigen, dass die Codelösung, die Brad gepostet hat, genau das tut, was wir brauchen werden.

Ich konnte meinen Verdacht bestätigen, dass der erwartete Wert tatsächlich ein binäres codiertes Decmial war. Ich konnte bestätigen, dass der erwartete Wert nur Arbeiten einen Hex -Wert hat. Ein Mitarbeiter war in der Lage, die Uhrzeit und das Datum unabhängig zu bestätigen, indem er Tabelle für den Standard verwendet hat. Daher fühle ich mich wohl, dass ich dies ins Bett bringt.

Ich konnte bestätigen, dass aus irgendeinem Grund der dezmiale Wert der Daten nicht funktioniert, ich nur schließen kann, dass die Daten vom Gerät als Hex -Wert gesendet werden. Mein einziges Problem ist, dass andere Anwendungen in einer ähnlichen Methode funktionieren.

Ich schätze die Hilfe aller, dies herauszufinden. Einige der Kommentare führen mich auf einen Weg, der es mir ermöglicht, herauszufinden.

War es hilfreich?

Lösung

Nun, obwohl die Zahlen nicht sinnvoll zu sein scheinen, habe ich mir das ausgedacht (die Ergebnisse geben du bist Erwartung (aus den angegebenen Beispielen). Nehmen Sie dies durch den Wringer und prüfen Sie, ob es alle Ergebnisse erzielt, die Sie erwarten:

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

Ich mache wirklich nur einen Schuss im Dunkeln, da die Zahlen, die Sie gegeben haben, nicht das, was ich typisch nennen würde. Trotzdem müssen Sie das machen, was Sie erhalten, also: Achselzucken:.

Andere Tipps

Wenn Sie die Nummer in die HEX -Darstellung konvertieren möchten, verwenden Sie das ToString mit "x" als Param:

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

Ich verstehe jedoch nicht wirklich, was Sie erreichen möchten, wenn Sie sagen, dass Sie für 2010 200A erwarten.

Sind Sie wirklich sicher, dass Ihr Beispiel richtig ist? Warum hast du eine Sechskantnummer, in der der erste Teil mit Basis 10 ist und der zweite Teil Basis 16 ist?

Normal würde eine davon:

  • 2010 => 0x07da
    • Vollständiges Hex
  • 2010 => 0x140a
    • Die Zahl ist auf halbem Weg gebrochen und jeder Teil ist Hex
  • 2010 => 0x2010
    • BCD codiert wie bei Wikipedia (wo sonst) ;-)

Nach einigem Googeln und Denken hier ist meine erste Idee:

  • Geben Sie alles in eine BinaryReader.
  • Holen Sie sich alle Werte individuell heraus, indem Sie anrufen BinaryReader.readbyte () und werfen Sie es einem int an int
  • Multiplizieren Sie jeden Wert zuerst mit 10 und dividieren Sie dann um 16
  • Geben Sie alle diese individuellen Werte in a List<int>
  • verwenden Math.Pow(value, 10 * (List.Count - indexOfValue)) all diese Werte zu aggregieren
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top