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; ち
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. –
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. –
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? –