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はここに表示されているようですが、デコードが乱れてしまいます。
私は次のようにこれらの文字列を読み込み、デコードすることができる午前:
- は
String
としてLINQを使用してフィールドを取得します。 0xFF
- 戻り
System.Text.Encoding.GetEncoding(1252).GetString()
これは完璧に動作してデコードされた文字列で各バイトをXORすることにより、System.Text.Encoding.GetEncoding(1252).GetBytes()
byte[]
を取得します。 問題は、LINQを使用してENCODED文字列をSQL Serverに戻すことができないということです。
私は基本的に逆のプロセスを以下だとやっている:
- は
ASCIIEncoding.GetBytes()
を使用してバイトを取得します。 (これはまっすぐな文字列であるため、CodePage 1252はここでは不要です。) 0xFF
でバイトをエンコードします。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)
を使用しないでください
SQLプロファイラを使用してL2Sで実行されるSQLをキャプチャし、それを投稿してください。
は、ここでは、あなたの問題と解決策を示すために、異なるエンコーディングを試みることができるいくつかの簡単な&汚いコード、です。 (これは非常に簡単です。) – usr
LINQ-to-SQLではなくLINQ-to-Entitiesを使用していますが、Profilerを使用してSQLをキャプチャすることをお勧めします。私はそれを設定し、それが何を言うか見る。しかし、私の推測では、SQLに格納される内容が格納されていることがわかります。エンティティFWからSQLへの非ASCII文字のマッピングに問題があると私は本当に信じています。 – user1536209
問題のデータベースの照合は何ですか? 'collation_name FROM sys.databases WHERE name = 'mydatabase''で見つけることができます。 – JamieSee