2017-05-30 6 views
0

Ich kann es wirklich nicht erarbeiten. Ich habe ein Wörterbuch, in dem ich eine Kodierungstabelle gespeichert habe. Ich versuche jetzt, den richtigen Wert für den Schlüssel zu erhalten. Die if-Klausel mit den verschiedenen where-Klauseln sollte zu 100% zu einem Ergebnis führen, tut es aber nicht. Werden die Where-Klauseln ignoriert?Where-Klausel im LINQ-Wörterbuch funktioniert nicht

public static string ByteArrayToHex(byte[] bytes) 
    {    
      StringBuilder Result = new StringBuilder(bytes.Length * 2); 
      string HexAlphabet = "ABCDEF"; 

      foreach (byte B in bytes) 
      { 
       Result.Append(HexAlphabet[(int)(B >> 4)]); 
       Result.Append(HexAlphabet[(int)(B & 0xF)]); 
      } 

      return Result.ToString(); 

    } 


static void Main(string[] args) 
    { 
     List<byte> byteList2 = new List<byte>() { 227, 129,130 }; 

     List<byte> byteList = new List<byte>() {131, 95, 131, 126, 129, 91}; 
     string filename = "file.txt"; 
     var dict = Shared.IO.Read.EncodingTable(filename); 

     var original = Encoding.GetEncoding(932).GetString(byteList.ToArray()); 
     var custom = CustomConverter(byteList, dict); 

     var original2 = Encoding.GetEncoding(932).GetString(byteList2.ToArray()); 
     var custom2 = CustomConverter(byteList2, dict); 

     Console.WriteLine("Original: " + original); 
     Console.WriteLine("Custom: " + custom); 
     Console.WriteLine("Original: " + original2); 
     Console.WriteLine("Custom: " + custom2); 

     Console.ReadKey(); 
    } 

    static string CustomConverter(List<byte> byteList, Dictionary<string,string> dict) 
    { 
     var result = string.Empty; 

     while (byteList.Count != 0) 
     { 
      var count = byteList.Count; 

      byte[] bytes = new byte[] { }; 
      if (count > 2) bytes = new byte[3] {byteList[0], byteList[1], byteList[2]}; 
      if (count == 2) bytes = new byte[2] {byteList[0], byteList[1]}; 
      if (count == 1) bytes = new byte[1] {byteList[0]}; 

      var hexString = Shared.IO.Convert.ByteArrayToHex(bytes); 
      KeyValuePair<string,string> entry; 



      if (hexString.Length > 2) 
      { 
       var a = hexString.Substring(0, 4); 
       var b = hexString.Substring(0, 2); 
       var c = hexString.Substring(0, 1); 

       entry = (from item in dict 
        where item.Key == hexString || item.Key == a || item.Key == b || item.Key == c 
        select item).First(); 
      } 

      else 
      { 
       var a = hexString.Substring(0, 1); 

       entry = (from item in dict 
       where item.Key == hexString || item.Key == a 
       select item).First(); 
      } 
      byteList.RemoveRange(0, (entry.Key.Length/2)); 

      result = result + entry.Value; 
     } 

     return result; 
}` 

public static Dictionary<string, string> EncodingTable(string filename) 
    { 
     string directory = Environment.CurrentDirectory + @"\encoding\"; 
     string path = directory + filename; 

     Dictionary<string,string> encodingTable = new Dictionary<string, string>(); 

     var lines = System.IO.File.ReadAllLines(path); 

     foreach (var line in lines) 
     { 
      if (string.IsNullOrEmpty(line)) continue; 
      if (line.StartsWith("#")) continue; 

      var lineArray = line.Split(';'); 
      encodingTable.Add(lineArray[0], lineArray[1]); 
     } 

     return encodingTable; 
    }` 

Das Wörterbuch enthält Dinge wie diese

79; か 7A; き 7B; く 7C; け 7D; こ 7E; さ 7F; し 80; す 81 ; せ 82; そ 83; た 84; ち

+2

Bitte posten Sie ein [mcve]. Wir müssen die Schlüssel, die Sie in diesem Wörterbuch haben, sowie die Bytes, mit denen Sie versuchen, zu vergleichen, sehen. Schreiben Sie auch, was 'ByteArrayToHex' zurückgibt. –

+0

Können Sie Ihr Codebeispiel mit etwas aktualisieren, mit dem wir Ihr Ergebnis reproduzieren können? So wie es ist, wissen wir nicht, was der Wert von 'hexString' ist oder was das Wörterbuch enthält. Eine kurze Methode, die das Wörterbuch auffüllt, wäre hilfreich. –

+0

Was gibt 'ByteArrayToHex' zurück? Ich nehme an, es ist eine Zeichenkette wegen des 'Substring'-Aufrufs, aber dann rufst du 'Substring (0,1)', wenn die Länge größer als 2 ist. Hast du die Werte von' a', 'b',' c' in inspiziert der Debugger, um sicherzustellen, dass sie das sind, was Sie erwarten? –

Antwort

0

Code gegeben, und eine datei.txt mit den Daten zu erstellen Sie prov ided mit

suplemented

5F;_ 5B;[ E1;# E3;#

erhalte ich die Antwort:

Original: ダミー 
Custom: た _た さ せ [ 
Original: 縺・ 
Custom: #せ そ 

Sind Sie sehen etwas anderes? Oder ist das nicht was du willst?

+0

Ja, es sieht korrekt aus (ohne das ganze Wörterbuch zu kennen). Mein Ergebnis ist HEX: 835F837E815B Original: ダ ミ ー Gewohnheit: た e た さ せ ein HEX: E38182 Original: 縺 · Gewohnheit: せ そ HEX: 5F5BE1E3 Original: 膺 Ãq7 Gewohnheit:? GOQ Ich habe eine andere Lösung verwendet. dict.TryGetValue und wenn es wahr ist, starte ich die Abfrage. – Insight

0

Soweit ich verschiedene Dinge ausprobiert habe, ist die TryGetValue-Methode die beste Wahl als zu viele Bedingungen zu verwenden. Auch wenn die Leistung wirklich schlecht war. Danke für den Hinweis "D Stanley".

Das Ziel ist ein Wörterbuch (Größe = max 3 Bytes) einzuchecken, wenn mein aktuelles Array (umgewandelt in einen Hexstring) in diesem Wörterbuch ist. Wenn dies der Fall ist, soll es den Ausgabewert zurückgeben. Hoffentlich findet es jemand nützlich.

private static string _hexString = null; 
    public static string ByteValueToCustomEncoding(byte[] byteArray, Dictionary<string, string> dict) 
    { 
     var result = string.Empty; 

     _hexString = Shared.IO.Convert.ByteArrayToHex(byteArray); 

     while (_hexString.Length > 0) 
     { 
      string entry = string.Empty; 

      if (_hexString.Length >= 6) 
      { 
       entry = Helper(dict); 
      } 

      else if (_hexString.Length >= 4) 
      { 
       entry = Helper(dict); 
      } 

      else if (_hexString.Length >= 2) 
      { 
       entry = Helper(dict); 
      } 

      else if (_hexString.Length >= 1) 
      { 
       entry = Helper(dict); 
      } 

      result = result + entry; 
     } 

     return result; 
    } 

    private static string Helper(Dictionary<string,string> dict) 
    { 
     string temp = String.Empty; 

     for (int i = (_hexString.Length > 6) ? 6: _hexString.Length; i >= 0; i = i - 2) 
     { 
      if (dict.TryGetValue(_hexString.Substring(0, (i == 0) ? 1 : i), out temp)) 
      { 
       _hexString = _hexString.Remove(0, i); 
       return temp; 
      } 
     } 

     _hexString = _hexString.Remove(0, 1); 

     return temp; 
    }