Я попробовал это, и я не могу воспроизвести вашу проблему 'Недопустимый заголовок GZip'. Вот что я сделал:
Java сторона
Я взял ваш метод сжатия Java вместе с этим фрагментом кода Java:
public static String ToHexString(byte[] bytes){
StringBuilder hexString = new StringBuilder();
for (int i = 0; i < bytes.length; i++)
hexString.append((i == 0 ? "" : "-") +
Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1));
return hexString.toString();
}
Итак, это минималистичное Java-приложение, которое берет байты тестовой строки, сжимает ее и преобразовывает в шестнадцатеричную строку сжатых данных ...:
public static void main(String[] args){
System.out.println(ToHexString(fromByteToGByte("asdf".getBytes())));
}
... выводит следующее (я добавил аннотации) :
1f-8b-08-00-00-00-00-00-00-00-4b-2c-4e-49-03-00-bd-f3-29-51-04-00-00-00
^------- GZip Header -------^ ^----------- Compressed data -----------^
C # сторона
Я написал два метода для сжатия и распаковки байтового массива в другой байтовый массив (метод сжатия только для полноты и моих тестов) :
public static byte[] Compress(byte[] uncompressed)
{
using (MemoryStream ms = new MemoryStream())
using (GZipStream gzs = new GZipStream(ms, CompressionMode.Compress))
{
gzs.Write(uncompressed, 0, uncompressed.Length);
gzs.Close();
return ms.ToArray();
}
}
public static byte[] Decompress(byte[] compressed)
{
byte[] buffer = new byte[4096];
using (MemoryStream ms = new MemoryStream(compressed))
using (GZipStream gzs = new GZipStream(ms, CompressionMode.Decompress))
using (MemoryStream uncompressed = new MemoryStream())
{
for (int r = -1; r != 0; r = gzs.Read(buffer, 0, buffer.Length))
if (r > 0) uncompressed.Write(buffer, 0, r);
return uncompressed.ToArray();
}
}
Вместе с небольшой функцией, которая принимает шестнадцатеричную строку и возвращает ее обратно в байтовый массив ... (также только для целей тестирования) :
public static byte[] ToByteArray(string hexString)
{
hexString = hexString.Replace("-", "");
int NumberChars = hexString.Length;
byte[] bytes = new byte[NumberChars / 2];
for (int i = 0; i < NumberChars; i += 2)
bytes[i / 2] = Convert.ToByte(hexString.Substring(i, 2), 16);
return bytes;
}
... Я сделал следующее:
// Just hardcoded the output of the java program, convert it back to byte[]
byte[] fromjava = ToByteArray("1f-8b-08-00-00-00-00-00-00-00-" +
"4b-2c-4e-49-03-00-bd-f3-29-51-04-00-00-00");
// Decompress it with my function above
byte[] uncompr = Decompress(fromjava);
// Get the string out of the byte[] and print it
Console.WriteLine(System.Text.ASCIIEncoding.ASCII
.GetString(uncompr, 0, uncompr.Length));
Et вуаля, вывод:
asdf
Прекрасно работает для меня. Возможно, вам следует проверить метод декомпрессии в вашем приложении c #.
Вы сказали в своем предыдущем вопросе, что храните эти байтовые массивы в базе данных, верно? Может быть, вы хотите проверить, возвращаются ли байты из базы данных так, как вы их поместили.