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를 사용하여 필드를 가져옵니다 다음과 같이나는 이러한 문자열을 읽고 디코딩 할 수 있어요.
- 이 완벽하게 작동
System.Text.Encoding.GetEncoding(1252).GetString()
와 0xFF
byte[]
사용 System.Text.Encoding.GetEncoding(1252).GetBytes()
문제는 LINQ를 사용하여 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 6 층 3E 디코딩 된 바이트 : 85 (62) (90) (C1) 디코딩 된 PW : B A
암호는 실제로 "ABCD"코드 페이지 1252 사용 Encoding.GetEncoding(28591)
를 사용하지 마십시오
SQL 프로파일 러를 사용 L2S에 의해 실행 된 SQL을 캡처하고 그것을 게시하시기 바랍니다 :
다음은 문제와 해결책을 입증하기 위해, 다른 인코딩으로 시도 할 수있는 몇 가지 빠른 & 더러운 코드입니다. (매우 쉽게 할 수 있습니다.) – usr
LINQ-to-Entities가 아닌 LINQ-to-SQL을 사용하고 있지만 프로파일 러를 사용하여 SQL을 캡처하는 것이 좋습니다. 나는 그것을 설정하고 그것이 말하는 것을 보게 될 것이다. 하지만 제 생각에 SQL은 저장하라는 내용을 SQL이 정확히 저장하고 있음을 보여줍니다. 정말 문제가 비 ASCII 문자를 Entity FW에서 SQL로 매핑하는 것이라고 생각합니다. – user1536209
해당 데이터베이스의 데이터 정렬은 어떻게됩니까? 'collation_name FROM sys.databases WHERE name = 'mydatabase''에서 찾을 수 있습니다. – JamieSee