7

LINQ-to-Entitiesに8ビットのASCII文字を扱う際に興味深い問題があります。8ビットASCIIデータのLINQ-to-Entities

疑似暗号化された列を持つSQL Server 2000データベースを継承しました。文字列を0xFFとXORするだけです。なぜ、私がそれが不自由だと知っているのか分かりませんが、それは私たちが現在いるところです。

これらの列は、SQLデータ型がchar(7)およびchar(14)です。 0xFFをXORすると、すべての場合に8番目のビットが設定されるため、ASCII以外の文字(Microsoftの定義によると)になります。 UTF-8はここに表示されているようですが、デコードが乱れてしまいます。

私は次のようにこれらの文字列を読み込み、デコードすることができる午前:

  1. StringとしてLINQを使用してフィールドを取得します。
  2. 0xFF
  3. 戻りSystem.Text.Encoding.GetEncoding(1252).GetString()

これは完璧に動作してデコードされた文字列で各バイトをXORすることにより、System.Text.Encoding.GetEncoding(1252).GetBytes()

  • デコードを使用してbyte[]を取得します。

    問題は、LINQを使用してENCODED文字列をSQL Serverに戻すことができないということです。

    私は基本的に逆のプロセスを以下だとやっている:

    1. ASCIIEncoding.GetBytes()を使用してバイトを取得します。 (これはまっすぐな文字列であるため、CodePage 1252はここでは不要です。)
    2. 0xFFでバイトをエンコードします。
    3. GetEncoding(1252).GetString()でエンコードされた文字列を返します。

    私の文字列を見ると、まさに私が期待しているものです。しかし、私のエンティティでそれを詰め込み、SaveChanges()を実行すると、結果として得られるSQL Serverの値は、常に"?????"の長さになります。

    私はここに何かが欠けていると確信していますが、私は考えることができ、それを得ることができないすべてを試しました。今のところ私はちょうどSqlCommandを使用し、符号化された文字列をSqlParametersとして更新する旧式の方法に戻りました。そこに問題はなく、毎回働く。

    ありがとうございました。


    更新:

    私はJamieSeeからの提案を試してみましたが、私も彼の方法との良好なデコードが届きません。私が持っている:

    static void Main(string[] args) 
        { 
         Encoding characterEncoding = Encoding.GetEncoding(28591); 
    
         HCBPWEBEntities ent = new HCBPWEBEntities(); 
    
         var encUser = 
          (from users in ent.tblEmployer 
          where users.ipkEmpId == 357 
          select users.sKey).First(); 
    
         Console.Out.WriteLine("Original XOR Encoded PW: {0}", encUser.ToString().Trim()); 
    
         byte[] originalBytes = (from character in characterEncoding.GetBytes(encUser.ToString().Trim()) 
               select (byte)(character)).ToArray(); 
    
         Console.Write("Original Bytes:\t"); 
         foreach (byte b in originalBytes) 
         { 
          Console.Write("{0:x} ", b); 
         } 
         Console.WriteLine(String.Empty); 
    
         byte[] decodedBytes = (from character in characterEncoding.GetBytes(encUser.ToString().Trim()) 
               select (byte)(character^0xFF)).ToArray(); 
    
         Console.Write("Decoded Bytes:\t"); 
         foreach (byte b in decodedBytes) 
         { 
          Console.Write("{0:x} ", b); 
         } 
         Console.WriteLine(String.Empty); 
    
         string decoded = characterEncoding.GetString(decodedBytes); 
         Console.WriteLine("Decoded PW: {0}", decoded); 
    
         ent.Dispose(); 
        } 
    

    しかし、結果は以下のとおりです。

    オリジナルXORエンコードPW:Z?o>が オリジナルバイト:7aは9D 6fの3E デコードバイト:85 62 90 C1 デコードPW:?B A

    パスワードが実際にある "ABCD" のコードページ1252を使用Encoding.GetEncoding(28591)を使用しないでください

  • +0

    SQLプロファイラを使用してL2Sで実行されるSQLをキャプチャし、それを投稿してください。

    は、ここでは、あなたの問題と解決策を示すために、異なるエンコーディングを試みることができるいくつかの簡単な&汚いコード、です。 (これは非常に簡単です。) – usr

    +0

    LINQ-to-SQLではなくLINQ-to-Entitiesを使用していますが、Profilerを使用してSQLをキャプチャすることをお勧めします。私はそれを設定し、それが何を言うか見る。しかし、私の推測では、SQLに格納される内容が格納されていることがわかります。エンティティFWからSQLへの非ASCII文字のマッピングに問題があると私は本当に信じています。 – user1536209

    +0

    問題のデータベースの照合は何ですか? 'collat​​ion_name FROM sys.databases WHERE name = 'mydatabase''で見つけることができます。 – JamieSee

    答えて

    1

    ? (iso-8859-1)またはEncoding.GetEncoding(850)(ibm850)のいずれかで、8ビットのASCIIベースの文字セットが得られます。

    public static void Main() 
    { 
        Encoding characterEncoding = Encoding.GetEncoding(28591); 
    
        string original = "This is some bogus data to test the problem."; 
        Console.WriteLine("Original String: {0}", original); 
    
        Console.Write("Original Bytes: "); 
        foreach (byte b in characterEncoding.GetBytes(original)) 
        { 
         Console.Write("{0:x}", b); 
        } 
        Console.WriteLine(); 
    
        byte[] encodedBytes = (from character in characterEncoding.GetBytes(original) 
              select (byte)(character^0xFF)).ToArray(); 
    
        Console.Write("Encoded Bytes: "); 
        foreach (byte b in encodedBytes) 
        { 
         Console.Write("{0:x}", b); 
        } 
        Console.WriteLine(); 
    
        string encoded = characterEncoding.GetString(encodedBytes); 
    
        byte[] decodedBytes = (from character in characterEncoding.GetBytes(encoded) 
              select (byte)(character^0xFF)).ToArray(); 
    
        Console.Write("Decoded Bytes: "); 
        foreach (byte b in decodedBytes) 
        { 
         Console.Write("{0:x}", b); 
        } 
        Console.WriteLine(); 
    
        string decoded = characterEncoding.GetString(decodedBytes); 
    
        Console.WriteLine("Decoded String: {0}", decoded); 
    } 
    
    関連する問題