2

私はおそらくこれをすべて1つの質問に入れるべきでした、申し訳ありません:(

2番目のエラー

わかりました、これでエラーは終わりです(うまくいけば):

private static string getCRC(string input, bool appendDate)
{
    string toEnc = string.Format("{0}{1}", input, appendDate == true ? string.Format("{0:yyyyMMdd}", System.DateTime.Now) : "");
    System.IO.MemoryStream mStream = new System.IO.MemoryStream(System.Text.ASCIIEncoding.ASCII.GetBytes(toEnc), false);
    
    CRC32 oCRC = new CRC32();
    return oCRC.GetCrc32(((System.IO.Stream)mStream)).ToString();
}

エラーはリターンラインにあります:

コンパイラエラーメッセージ: CS1502:「CRC.CRC32.GetCrc32(refSystem.IO.Stream)」に最もよく一致するオーバーロードされたメソッドにいくつかの無効な引数があります

参照している関数は次のとおりです。

public UInt32 GetCrc32(ref System.IO.Stream stream)
{
    //Dim crc32Result As Integer = &HFFFFFFFF
    UInt32 crc32Result = UInt32.MaxValue;

    try
    {

        byte[] buffer = new byte[BUFFER_SIZE];
        int readSize = BUFFER_SIZE;

        int count = stream.Read(buffer, 0, readSize);
        int i;
        UInt32 iLookup;
        //Dim tot As Integer = 0
        while ((count > 0))
        {
            for (i = 0; i <= count - 1; i++)
            {
                iLookup = (crc32Result & 0xff) ^ buffer[i];
                //crc32Result = ((crc32Result And &HFFFFFF00) \ &H100) And &HFFFFFF                     ' nasty shr 8 with vb :/
                crc32Result = ((UInt32)((crc32Result & 4294967040L) / 256) & UInt32.MaxValue);
                // nasty shr 8 with vb :/
                crc32Result = crc32Result ^ crc32Table[iLookup];
            }
            count = stream.Read(buffer, 0, readSize);
        }
    }
    catch (Exception ex)
    {
        HttpContext.Current.Response.Output.Write(string.Format("{0}{1}{2}", ex.Message, Environment.NewLine, ex.StackTrace));
        System.Diagnostics.Debugger.Break();
    }

    return (~crc32Result);

}

ご覧のとおり、メモリストリームをストリームとしてキャストしようとしましたが、あまり好きではなかったと思います。

最初のエラー

ここで解決

私の最後のいくつかの質問を見たことがない場合は、VB.NETで記述されたCRC関数があります。オンラインコンバーターを使用してC#に変換しました。元のVBコードは次のとおりです。

Public Sub New()
    Dim dwPolynomial As UInt32 = 3988292384
    Dim i As Integer, j As Integer

    ReDim crc32Table(256)
    Dim dwCrc As UInt32

    For i = 0 To 255
        dwCrc = i
        For j = 8 To 1 Step -1
            If (dwCrc And 1) Then
                dwCrc = ((dwCrc And &HFFFFFFFE) \ 2&) And &H7FFFFFFF
                dwCrc = dwCrc Xor dwPolynomial
            Else
                dwCrc = ((dwCrc And &HFFFFFFFE) \ 2&) And &H7FFFFFFF
            End If
        Next j
        crc32Table(i) = dwCrc
    Next i
End Sub

これが私の変換されたコードです。私は私が持っていたエラーのいくつかを修正しましたが、私が理解できないものがいくつかあります:

public CRC32()
{
    UInt32 dwPolynomial = ((UInt32)3988292384L);
    int i;
    int j;

    UInt32[] crc32Table;
    crc32Table = new UInt32[256];
    UInt32 dwCrc;

    for (i = 0; i <= 255; i++)
    {
        dwCrc = ((UInt32)i);
        for (j = 8; j >= 1; j -= 1)
        {
            if ((dwCrc & 1))
            {
                dwCrc = ((dwCrc & 0xfffffffe) / 2L) & 0x7fffffff;
                dwCrc = dwCrc ^ dwPolynomial;
            }
            else
            {
                dwCrc = ((dwCrc & 0xfffffffe) / 2L) & 0x7fffffff;
            }
        }
        crc32Table[i] = dwCrc;
    }
}

最初のエラーは次の行にあります。

コンパイラエラーメッセージ: CS0030:タイプ「uint」を「bool」に変換できません

if ((dwCrc & 1))

これらの2つの値を別の演算子で比較する必要がありますか?正直なところ、なぜ&オペレーターがそこにいるのかよくわかりません。

ありがとうSO。

4

6 に答える 6

7

C#には、暗黙の整数からブールへの変換はありません。明示的に0と比較する必要があります。

if ((dwCrc & 1) != 0) ...
于 2009-07-24T19:30:44.177 に答える
2

2番目の問題(2番目の質問として投稿した場合はトラフィックが増えたはずです):

'CRC.CRC32.GetCrc32(ref System.IO.Stream)'に最適なオーバーロードされたメソッドの一致には、いくつかの無効な引数があります

refC#コードの修飾子を削除します。

public UInt32 GetCrc32(ref System.IO.Stream stream)

になります

public UInt32 GetCrc32(System.IO.Stream stream)

元のVB.NETには必要のない場所にByRefがあったのではないかと思いますstream。どこの値も再割り当てされていないようです。

または、refパラメーターを使用して呼び出します。

return oCRC.GetCrc32(ref mStream).ToString();
于 2009-07-24T21:03:45.317 に答える
2

C#は、0がfalseに等しく、1がtrueに等しいとは想定していません。

したがって

if ((dwCrc & 1) == 1) { }

あなたが必要なものになります。

于 2009-07-24T19:31:22.430 に答える
1

ReSharperの助けを借りて、変換されたコードをコンパイルしました。

これを試してみてください:

    public void CRC32()
    {
        UInt32 dwPolynomial = ((UInt32) 3988292384L);
        int i;
        int j;

        UInt32[] crc32Table;
        crc32Table = new UInt32[256];
        UInt32 dwCrc;

        for (i = 0; i <= 255; i++)
        {
            dwCrc = ((UInt32) i);
            for (j = 8; j >= 1; j -= 1)
            {
                if ((dwCrc & 1) != 0u)
                {
                    dwCrc = (uint) (((dwCrc & 0xfffffffe)/2L) & 0x7fffffff);
                    dwCrc = dwCrc ^ dwPolynomial;
                }
                else
                {
                    dwCrc = (uint) (((dwCrc & 0xfffffffe)/2L) & 0x7fffffff);
                }
            }

            crc32Table[i] = dwCrc;
        }
    }
于 2009-07-24T19:36:59.110 に答える
0

その特定の行はビット単位であり、dwCrcと1をAND演算します。これは0x01です。したがって、基本的には、dwCrcの最下位ビットが0ではなく1であることを確認しています。そうでない場合、結果は1になります。そうでない場合、結果は0になります。VBでは、整数は自動的にブールに変換されます(0-> false 、その他すべて-> true)。C#では、値と明示的に比較する必要があります

if ((dwCrc & 1) != 0) ...

(また、(&1)は、特定の1ビットのみをチェックするため、おそらく必要であることに注意してください。dwCrc== 0x02の場合、変換されたテストと同様に、元のテストは失敗します。

if(dwCrc != 0) ...

最初はそうではないように見えるかもしれませんが、間違っているでしょう。)

于 2009-07-24T19:33:31.487 に答える
0

Looks like a lot of these responses address your first error. The problem with your second error is that your GetCrc method expects the stream to be passed by reference (the ref keyword).

In C#, If the method defines a parameter by reference, you have to explicitly pass it by reference when you call it. So add the ref keyword when you call your GetCrcMethod:

(also, you don't need the cast -- MemoryStream inherits from Stream)

return oCrc.GetCrc32(ref mStream).ToString();

One other consideration: Unless you plan to change which strem mStream references, you don't need to make a byRef parameter. Unless you plan to assign a value to stream (stream = new stream, or stream = null), it is more correct to just remove the ref keyword from the method declaration altogether.

于 2009-07-24T20:58:30.333 に答える