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. 이 완벽하게 작동 System.Text.Encoding.GetEncoding(1252).GetString()

0xFF

  • 돌아 가기로 디코딩 된 문자열을 각 바이트를 XOR 연산하여 byte[] 사용 System.Text.Encoding.GetEncoding(1252).GetBytes()
  • 디코드를 가져옵니다.

    문제는 LINQ를 사용하여 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 6 층 3E 디코딩 된 바이트 : 85 (62) (90) (C1) 디코딩 된 PW : B A

    암호는 실제로 "ABCD"코드 페이지 1252 사용 Encoding.GetEncoding(28591)를 사용하지 마십시오

  • +0

    SQL 프로파일 러를 사용 L2S에 의해 실행 된 SQL을 캡처하고 그것을 게시하시기 바랍니다 :

    다음은 문제와 해결책을 입증하기 위해, 다른 인코딩으로 시도 할 수있는 몇 가지 빠른 & 더러운 코드입니다. (매우 쉽게 할 수 있습니다.) – usr

    +0

    LINQ-to-Entities가 아닌 LINQ-to-SQL을 사용하고 있지만 프로파일 러를 사용하여 SQL을 캡처하는 것이 좋습니다. 나는 그것을 설정하고 그것이 말하는 것을 보게 될 것이다. 하지만 제 생각에 SQL은 저장하라는 내용을 SQL이 정확히 저장하고 있음을 보여줍니다. 정말 문제가 비 ASCII 문자를 Entity FW에서 SQL로 매핑하는 것이라고 생각합니다. – user1536209

    +0

    해당 데이터베이스의 데이터 정렬은 어떻게됩니까? 'collation_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); 
    } 
    
    관련 문제