Hex na Bin u velkých dat

Jak převést HEX na BIN pro soubory uložené ve formátu base64

Pokud ještě z jakéhokoliv důvodu ukládáš do databáze obrázky v base64, budeš řešit problém s převodem zpět pro jejich zobrazení.
Při prohledávání stackOverflow narazíte na mnoho návodů jak toto jednoduše provést, ale všechny u mě končily chybou. Důvod je velikostí dat k převodu - jednoduché návody s tímto nepočítají.

Pro převod takových souborů budeš potřebovat tento kód

private Byte[] HexToBin(string pHexString) { if (String.IsNullOrEmpty(pHexString)) { return new Byte[0]; } if (pHexString.Length % 2 != 0) { throw new Exception("Hexstring must have an even length"); } Byte[] bin = new Byte[pHexString.Length / 2]; int o = 0; int i = 0; for (; i < pHexString.Length; i += 2, o++) { switch (pHexString[i]) { case '0': bin[o] = 0x00; break; case '1': bin[o] = 0x10; break; case '2': bin[o] = 0x20; break; case '3': bin[o] = 0x30; break; case '4': bin[o] = 0x40; break; case '5': bin[o] = 0x50; break; case '6': bin[o] = 0x60; break; case '7': bin[o] = 0x70; break; case '8': bin[o] = 0x80; break; case '9': bin[o] = 0x90; break; case 'A': case 'a': bin[o] = 0xa0; break; case 'B': case 'b': bin[o] = 0xb0; break; case 'C': case 'c': bin[o] = 0xc0; break; case 'D': case 'd': bin[o] = 0xd0; break; case 'E': case 'e': bin[o] = 0xe0; break; case 'F': case 'f': bin[o] = 0xf0; break; default: throw new Exception("Invalid character found during hex decode"); } switch (pHexString[i + 1]) { case '0': bin[o] |= 0x00; break; case '1': bin[o] |= 0x01; break; case '2': bin[o] |= 0x02; break; case '3': bin[o] |= 0x03; break; case '4': bin[o] |= 0x04; break; case '5': bin[o] |= 0x05; break; case '6': bin[o] |= 0x06; break; case '7': bin[o] |= 0x07; break; case '8': bin[o] |= 0x08; break; case '9': bin[o] |= 0x09; break; case 'A': case 'a': bin[o] |= 0x0a; break; case 'B': case 'b': bin[o] |= 0x0b; break; case 'C' case 'c': bin[o] |= 0x0c; break; case 'D': case 'd': bin[o] |= 0x0d; break; case 'E': case 'e': bin[o] |= 0x0e; break; case 'F': case 'f': bin[o] |= 0x0f; break; default: throw new Exception("Invalid character found during hex decode"); } } return bin; }

Zobrazení takové fotografie poté takto:

public static BitmapSource GetImageStream(Image myImage) { var bitmap = new Bitmap(myImage); IntPtr bmpPt = bitmap.GetHbitmap(); BitmapSource bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap( bmpPt, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); bitmapSource.Freeze(); return bitmapSource; } //... if (reader["Image"] != DBNull.Value) { Byte[] byteBLOBData = (Byte[])reader["Image"]; string result = System.Text.Encoding.UTF8.GetString(byteBLOBData); Byte[] binaryImage = HexToBin(result); MemoryStream stream = new MemoryStream(binaryImage); Image img = Image.FromStream(stream); ImageXY.Source = GetImageStream(img); }

C# červen 2018