2016-04-12 10 views
2

Ich habe String-Variable wie a="0xECBDE9721C47B", möchte ich diesen Teil in einer neuen Variablen des Typs System.Data.SqlTypes.SqlBytes konvertieren. Was ich brauche, ist, den Wert in dieser Zeichenfolge zu dekomprimieren.Konvertieren Zeichenfolge in System.Data.SqlTypes.SqlBytes C#

Für dekomprimieren will ich diese Funktion nutzen:

/// Decompressing the data 
/// </summary> 
[Microsoft.SqlServer.Server.SqlFunction(IsDeterministic = true, IsPrecise = true, 
    DataAccess = DataAccessKind.None)] 
public static SqlBytes BinaryDecompress(SqlBytes input) 
{ 
    if (input.IsNull) 
    return SqlBytes.Null; 

    int batchSize = 32768; 
    byte[] buf = new byte[batchSize]; 

    using (MemoryStream result = new MemoryStream()) 
    { 
    using (DeflateStream deflateStream = 
     new DeflateStream(input.Stream, CompressionMode.Decompress, true)) 
    { 
     int bytesRead; 
     while ((bytesRead = deflateStream.Read(buf, 0, batchSize)) > 0) 
     result.Write(buf, 0, bytesRead); 
    } 
    return new SqlBytes(result.ToArray()); 
    } 
} 

Antwort

2

Vielleicht können Sie versuchen:

public static byte[] GetBinaryFromHexaString (string hexa) 
{ 
    byte[] data = null; 
    List<byte> bList = new List<byte>(); 
    try { 
     for (int i = 2; i < hexa.Length - 1; i+=2) { 
      string hStr = hexa.Substring(i, 2); 
      byte b = byte.Parse(hStr, NumberStyles.HexNumber, CultureInfo.InvariantCulture); 
      bList.Add (b); 
     } 
     data = bList.ToArray(); 
    } 
    catch {} 
    return data; 
} 

var sqlBytes = new System.Data.SqlTypes.SqlBytes (GetBinaryFromHexaString(a)); 

wo a Ihre Eingabezeichenfolge ist, mit 0x beginnen.
Danach können Sie:

var decompressed = BinaryDecompress(sqlBytes); 

Edit:
Versuchen Sie dieses:

public static SqlBytes BinaryDecompress(SqlBytes input) 
{ 
    if (input.IsNull) 
    return SqlBytes.Null; 

    var outputStream = new MemoryStream(); 
    using (MemoryStream result = new MemoryStream()) 
    { 
     using (DeflateStream deflateStream = new DeflateStream(input.Stream, CompressionMode.Decompress)) 
     { 
      deflateStream.CopyTo(outputStream); 
     } 
    } 

    outputStream.Position = 0; 
    return new SqlBytes (outputStream); 

} 

Edit 2:
Ich habe schon versucht, diese mit Ihre BinaryCompress & BinaryDecompress und arbeitet für mich.
Mein Testcode:

/// <summary> 
    /// Compressing the data 
    /// </summary> 
    [Microsoft.SqlServer.Server.SqlFunction(IsDeterministic = true, IsPrecise = true, DataAccess = DataAccessKind.None)] 
    public static SqlBytes BinaryCompress(SqlBytes input) 
    { 
     if (input.IsNull) return SqlBytes.Null; 

     using (MemoryStream result = new MemoryStream()) 
     { 
      using (DeflateStream deflateStream = 
        new DeflateStream(result, CompressionMode.Compress, true)) 
      { 
       deflateStream.Write(input.Buffer, 0, input.Buffer.Length); 
       deflateStream.Flush(); 
       deflateStream.Close(); 
      } 
      return new SqlBytes(result.ToArray()); 
     } 
    } 

    /// <summary> 
    /// Decompressing the data 
    /// </summary> 
    [Microsoft.SqlServer.Server.SqlFunction(IsDeterministic = true, IsPrecise = true, DataAccess = DataAccessKind.None)] 
    public static SqlBytes BinaryDecompress(SqlBytes input) 
    { 
     if (input.IsNull) return SqlBytes.Null; 

     int batchSize = 32768; 
     byte[] buf = new byte[batchSize]; 

     using (MemoryStream result = new MemoryStream()) 
     { 
      using (DeflateStream deflateStream = 
        new DeflateStream(input.Stream, CompressionMode.Decompress, true)) 
      { 
       int bytesRead; 
       while ((bytesRead = deflateStream.Read(buf, 0, batchSize)) > 0) 
        result.Write(buf, 0, bytesRead); 
      } 
      return new SqlBytes(result.ToArray()); 
     } 
    } 


    public static string GetHexaStringFromBinary (byte[] data) 
    { 
     string hexData = "0x"; 
     for (int i = 0; i < data.Length; i++) { 
      hexData = string.Concat (hexData, data[i].ToString("X2")); 
     } 
     return hexData; 
    } 


    public static byte[] GetBinaryFromHexaString (string hexa) 
    { 
     byte[] data = null; 
     List<byte> bList = new List<byte>(); 
     try { 
      for (int i = 2; i < hexa.Length - 1; i+=2) { 
       string hStr = hexa.Substring(i, 2); 
       byte b = byte.Parse(hStr, NumberStyles.HexNumber, CultureInfo.InvariantCulture); 
       bList.Add (b); 
      } 
      data = bList.ToArray(); 
     } 
     catch {} 
     return data; 
    } 

Und die Nutzung:

string originalStr = "This is a test string!!"; 
byte[] data = Encoding.ASCII.GetBytes (originalStr); 
SqlBytes sbCompressed = BinaryCompress (new SqlBytes (data)); 

string a = GetHexaStringFromBinary (sbCompressed.Value); 
//a = 0x0BC9C82C5600A2448592D4E21285E292A2CCBC74454500 

var sqlBytes = new SqlBytes(GetBinaryFromHexaString (a)); 
SqlBytes deCompressed = BinaryDecompress (sqlBytes); 
string finalStr = Encoding.ASCII.GetString (deCompressed.Value); 
//finalStr = "This is a test string!!" 

Hoffe, dass es ... hilft

+0

ich habe Fehler auf dieser Linie (var SqlBytes = System.Data. SqlTypes.SqlBytes (GetBinaryFromHexaString (a));), schreiben Sie, dass System.Data.SqlTypes.SqlBytes ein "Typ" ist, der im gegebenen Kontext nicht gültig ist – VasyPupkin

+0

Entschuldigung! Meine Schuld ... Ich habe den Beitrag bearbeitet. Versuchen Sie es mit: 'var sqlBytes = new System.Data.SqlTypes.SqlBytes (GetBinaryFromHexaString (a));' –

+0

Ich füge neue Zeilen hinzu? Wo war der Fehler? Byt ein anderes apeare, wie das in dieser Zeile while ((bytesRead = deflateStream.Read (buf, 0, batchSize))> 0), es ist über InvalidDataException wurde unbehandelt, kann Ihre Hilfe – VasyPupkin

0
Code ALL 

    /// <summary> 
    /// Compressing the data 
    /// </summary> 
    [Microsoft.SqlServer.Server.SqlFunction(IsDeterministic = true, IsPrecise = true, 
     DataAccess = DataAccessKind.None)] 
    public static SqlBytes BinaryCompress(SqlBytes input) 
    { 
     if (input.IsNull) 
     return SqlBytes.Null; 

    using (MemoryStream result = new MemoryStream()) 
    { 
     using (DeflateStream deflateStream = 
      new DeflateStream(result, CompressionMode.Compress, true)) 
     { 
      deflateStream.Write(input.Buffer, 0, input.Buffer.Length); 
      deflateStream.Flush(); 
      deflateStream.Close(); 
     } 
     return new SqlBytes(result.ToArray()); 
    } 
    } 

/// <summary> 
/// Decompressing the data 
/// </summary> 
[Microsoft.SqlServer.Server.SqlFunction(IsDeterministic = true, IsPrecise = true, 
     DataAccess = DataAccessKind.None)] 
public static SqlBytes BinaryDecompress(SqlBytes input) 
{ 
    if (input.IsNull) 
     return SqlBytes.Null; 

    int batchSize = 32768; 
    byte[] buf = new byte[batchSize]; 

    using (MemoryStream result = new MemoryStream()) 
    { 
     using (DeflateStream deflateStream = 
      new DeflateStream(input.Stream, CompressionMode.Decompress, true)) 
     { 
      int bytesRead; 
      while ((bytesRead = deflateStream.Read(buf, 0, batchSize)) > 0) 
       result.Write(buf, 0, bytesRead); 
     } 
     return new SqlBytes(result.ToArray()); 
    } 
} 
+0

können Sie mir auch helfen – VasyPupkin

+0

in der Nähe schreibe ich was ich mache – VasyPupkin