LINQ-to-Entities'de 8-bit "ASCII" karakterlerini işlerken ilginç bir sorun var ve birisinin bana bir ipucu vermesini umuyorum.8-bit ASCII verisine sahip LINQ-to Varlıklar
Bazı sahte kodlanmış sütunlara sahip bir SQL Server 2000 veritabanını, yalnızca 0xFF
ile dizgiyi XOR olarak aldıkları bir kalıtım devraldım. Neden olduğunu bilmiyorum ve topal olduğunu biliyorum ama şu an olduğumuz yer burası.
Bu sütunlar, SQL veri türü char(7)
ve char(14)
'dur. XOR, 0xFF
'u kullanarak her durumda 8. bit kümesini alırsınız, böylece ASCII olmayan (Microsoft'un tanımıyla) karakterlerle sonlanırsınız. UTF-8 burada gösteriliyor gibi görünüyor ama kod çözme berbatlaşıyor.
- bir
String
olarak LINQ kullanarak alanı al şu şekildedir:Ben bu dizeleri okumak ve deşifre etmek mümkün.
- Bu mükemmel çalışıyor
System.Text.Encoding.GetEncoding(1252).GetString()
ile 0xFF
byte[]
kullanılarak System.Text.Encoding.GetEncoding(1252).GetBytes()
Yapmakta olduğum sorun şu ki, LINQ kullanarak SQL Server'a bir ENCODED dize koyamıyorum.
Temelde ters süreci takip ediyorum ve yapıyorum:
ASCIIEncoding.GetBytes()
kullanarak bayt alın. (Burada düz bir dize olduğu için CodePage 1252'ye gerek yoktur.)- Baytları
0xFF
ile kodlayın. - Kodlanmış dizeyi
GetEncoding(1252).GetString()
ile döndür.
Dizgime bakarsak tam da beklediğim gibi olur. Ancak, bunu varlığımdan yükler ve SaveChanges()
yaparsam, SQL Server'daki sonuç değeri her zaman "?????"
olur.
Eminim ki burada bir şey kaçırıyorum ama düşünebileceğim her şeyi denedim ve alamıyorum. Şimdilik sadece SqlCommand
kullanarak eski moda yoluna ve SqlParameters
olarak kodlanmış dizelerle UPDATE yaptık. Orada sorun yok, her zaman çalışır.
Yardımlarınız için şimdiden teşekkür ederiz.
Güncelleme:
Ben JamieSee gelen öneri denedim ve hatta onun yöntemi ile iyi çözme girmem. Ben:
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();
}
Ama bu sonucudur:
Orijinal XOR kodlanmış PW: z?o> Orijinal Bayt: 7a 9d 6f 3e Decoded Bayt: 85 62 90 c1 Decoded PW:? b A
şifre aslında "abcd" kod sayfası 1252 kullanılmasını Encoding.GetEncoding(28591)
kullanmayın
SQL Profiler kullanarak L2S tarafından yürütülen SQL yakalamak ve bunu yayınlamak edin:
Burada sorunu ve çözümü göstermek için farklı kodlamalar ile deneyebilirsiniz bazı hızlı & kirli kod, bu. (Bunu yapmak son derece kolaydır.) – usr
LINQ-to-Entities kullanıyorum ve LINQ-to-SQL kullanmıyorum ancak SQL'i Profiler kullanarak yakalamak iyi bir fikir. Bunu ayarlayıp ne yazdığını göreceğim. Ama benim tahminim, SQL'in depolanması söylendiği şeyin tam olarak saklandığını göstermesi. Sorunun ASCII olmayan karakterleri Entity FW'dan SQL'e eşleştirdiğine inanıyorum. – user1536209
Söz konusu veritabanı için harmanlama nedir? SELECT collation_name FROM sys.databases WHERE name = 'mydatabase'' ile bulabilirsiniz. – JamieSee