2

ネイティブの Android アプリを開発するための C# の方法である dot42 について知りました。

したがって、CRC8 バイトを生成するためにいくつかの古いコードを使用する私の最初のプロジェクト方法です。プロジェクトに新しいクラスを作成し、コードをコピーして、通常どおり使用しようとしました。

私は取得し続けますjava.lang.VerifyErrorか??

私のクラスは単純な数学的計算です。パブリック メソッドとしてメイン アクティビティに分割すると、期待どおりに動作します。

ここに画像の説明を入力

しかし、静的クラスを使用しようとすると、そのエラーが発生し、問題を追跡する方法がわかりません。さまざまなAndroid名前空間を追加してみました。インスタンス化する通常のクラスにしてみました。internal

メソッドCRC8.Compute("mystring")は計算コードにも入りません(そこにブレークポイントを置いた場合)メソッドのすぐそこにスローされ、エラーが発生しますMainActivity.cs

dot42 を使用してこのようなクラスを使用するにはどうすればよいですか? (サイトでさまざまな例を見ましたが、実行する必要がある特定のことを特定することはできません)

namespace dot42Application1
{
    public class CRC8
    {
        static byte[] table = new byte[256];
        // x8 + x2 + x + 1 
        const byte poly = 0x07;

        public static string Compute(string ASCI)
        {
            int crcByte = Convert.ToInt16(ComputeChecksum(System.Text.Encoding.ASCII.GetBytes(ASCI)).ToString());
            return crcByte.ToString("000");
        }


        public static byte ComputeChecksum(byte[] bytes)
        {
            byte CRCInitialValue = 0xFF;
            //Final XOR value 0x00;
            //Not revered bytes
            //Not reverse CRC berfore final byte

            if (bytes != null && bytes.Length > 0)
            {
                foreach (byte b in bytes)
                {
                    CRCInitialValue = table[CRCInitialValue ^ b];
                }
            }
            return CRCInitialValue;
        }

        public CRC8()
        {
            for (int i = 0; i < 256; ++i)
            {
                int temp = i;
                for (int j = 0; j < 8; ++j)
                {
                    if ((temp & 0x80) != 0)
                    {
                        temp = (temp << 1) ^ poly;
                    }
                    else
                    {
                        temp <<= 1;
                    }
                }
                table[i] = (byte)temp;
            }
        }




    }
}

たぶんこれが役立ちます。スタックトレースは...

ここに画像の説明を入力

4

2 に答える 2

2

これは確かに dot42 コンパイラのバグです。次の行です。

int crcByte = Convert.ToInt16(...) は、int の ToString が呼び出されるよりも短い 16 ビットとして内部的に終了し、16 ビット値を 32 ビットにアップキャストせずに渡し、検証エラーが発生します。

私たち (dot42 コンパイラ チーム) は、この問題のケース/チケットを作成しました。

回避策として、コードを次のように変更できます: int crcByte = Convert.ToInt32(...)

お役に立てれば。

于 2013-09-17T09:43:55.377 に答える
1

いくつかの考えられる問題を確認してください:

  1. 静的コンストラクターはパラメーターなしである必要があります。
  2. メンバー名は、それを囲むタイプと同じにすることはできません。
  3. プロパティ: Android API 8 以上に設定することをお勧めします。
  4. どの IDE を使用していますか? ここに問題があるのではないでしょうか? (推奨VS2010)
  5. 最新の dot42 がインストールされており、必要なライセンス キーとセキュリティ キーがすべて揃っていますか?

VS2010 と最新の dot42 プラグインを Win7 OS にインストールし、同じエラーが発生することを期待してクラスをシミュレートしようとしましたが、すべて正常にコンパイルされました。シミュレートされた静的クラスは、同じ名前空間内の別のファイルに配置されます。その静的メソッドを他の別のクラス (MainActivity クラス) から呼び出します。

シミュレートされたクラスは次のとおりです。

using System;
using Android.App;
using Android.Os;
using Android.Widget;
using Dot42;
//using Dot42.Manifest;

namespace MyNamespace
{
    public  class CRC8
    {
        static byte[] table = new byte[256];
        //x8 + x2 + x + 1
        const byte poly = 0x07;

        public static byte getCRC(byte[] _bytes)
        {      return _bytes[0];
        }

        public static byte getCRC(String str_bytes)
        {      return (byte) str_bytes.CharAt(0); 
        }
         static  CRC8()
        {
            //nothing happens so far
        }
    }
}

MainActivity クラス内の呼び出しは次のとおりです。

protected override void OnCreate(Bundle savedInstance)
        {
            base.OnCreate(savedInstance);
            SetContentView(R.Layouts.MainLayout);

            TextView text_view = (TextView)FindViewById(R.Ids.textView1);

            byte[] aa = { 125, 54, 67, 78, 89 };
            byte b_ret = 0;

            b_ret = CRC8.getCRC("Ala ma kota");
            text_view.Text += "CRC8.getCRC(String): " + b_ret.ToString() + "\n";

            b_ret = CRC8.getCRC(aa);
            text_view.Text += "CRC8.getCRC(byte[]): " + b_ret.ToString() + "\n";

            text_view.Text += "CRC8.getCRC(ASCII.GetBytes): ";
            text_view.Text += CRC8.getCRC(System.Text.Encoding.ASCII.GetBytes("ABC123XYZ")).ToString() + "\n";
        }

出力は次のとおりです(API 18、つまりAndroid 4.3):

  • CRC8.getCRC (文字列): 65
  • CRC8.getCRC (バイト []): 125
  • CRC8.getCRC (ASCII.GetBytes): 65

私たちのコードなどの違いを見つけることができますか? これが役立つことを願っています。

于 2013-09-15T11:02:53.493 に答える