bcd hex string to integer
質問
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が投稿したコードソリューションが必要なことを正確に実行することを完全に確認することができました。
期待される値が実際にバイナリコード化されたDecmialであるという疑いを確認することができました。予想される値のみが16進価値を持っていることを確認することができました。同僚は、標準にテーブルを使用して、日時を独立して確認することができたので、これをベッドに入れるのは快適です。
何らかの理由でデータの断面値が機能しないことを確認することができました。データはデバイスによって16進価値として送信されていると結論付けることができます。私の唯一の懸念は、他のアプリケーションが同様の方法で機能することです。
私はこれを理解する際に誰もが助けてくれたことに感謝しています。いくつかのコメントは、私が理解できる道を私に導きます。
解決
まあ、数字が意味をなさないように見えますが、これは私が思いついたものです(結果を与えてください あなたは 期待する(提供された例から)。これを絞り手に介して、あなたが期待しているすべての結果が出てくるかどうかを確認してください。
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;
}
あなたが与えた数字は私が典型的なものと呼ぶものではないので、私は本当に暗闇の中でショットを撮っているだけです。そうは言っても、あなたは仕事を受けているものを作らなければなりません。
他のヒント
数字を16進表現に変換したい場合は、「x」でtoStringを使用してparamを使用してください。
2010.ToString("x") output: "7da"
しかし、2010年に200Aを期待していると言ったら、私はあなたが何を達成したいかを本当に理解していません。
あなたの例が正しいと本当に確信していますか?なぜ16進数があり、最初の部分はベース10と2番目の部分がベース16であるのですか?
普通 これらのいずれか:
- 2010 => 0x07da
- 完全なヘックス
- 2010 => 0x140a
- 数は途中で壊れており、各部分は六角形です
- 2010 => 0x2010
- wikipedia(他の場所)で見つかったようにエンコードされたbcd ;-)
いくつかのグーグルと考えた後、ここに私の最初のアイデアがあります:
- すべてをに入れます BinaryReader.
- 呼び出してすべての値を個別に取得します binaryreader.readbyte() そしてそれをintにキャストします
- 最初に各値に10を掛けてから、16で除算します
- この個々の値をすべてaに入れます
List<int>
- 使用する
Math.Pow(value, 10 * (List.Count - indexOfValue))
これらすべての値を集約します