FGFFFFFFGFFFFGGGGGGGGGGGGGFFFFFGGGGGGGGGGGGFFGFGGGFFFGGGGGGGGFFFFFFFFFFFFFFFFFFFFFGGGGGGFFFGFGGFGFFFFGFFGFGGFFFGFGGFGFFFGFGGGGFGGGGGGGGGFFFFFFFFGGGGGGGFFFFFGFFGGGGGGGFFFGGGFFGGGGGGFFGGGGGGGGGFFGFFGFGFFGFFGFFFFGGGGFGGFGGGFFFGGGFFFGGGFFGGFFGGGGFFGFGGFFFGFGGF
Хотя я не вижу реального применения, интригует тот факт, что алгоритмы сжатия, такие как gz, bzip2 и deflate, имеют в этом случае недостаток.
Ну, у меня есть ответ и код C# для демонстрации:
using System;
public class Program
{
public static void Main()
{
string testCase = "FGFFFFFFGFFFFGGGGGGGGGGGGGFFFFFGGGGGGGGGGGGFFGFGGGFFFGGGGGGGGFFFFFFFFFFFFFFFFFFFFFGGGGGGFFFGFGGFGFFFFGFFGFGGFFFGFGGFGFFFGFGGGGFGGGGGGGGGFFFFFFFFGGGGGGGFFFFFGFFGGGGGGGFFFGGGFFGGGGGGFFGGGGGGGGGFFGFFGFGFFGFFGFFFFGGGGFGGFGGGFFFGGGFFFGGGFFGGFFGGGGFFGFGGFFFGFGGF";
uint[] G = new uint[8]; // 256 bit
for (int i = 0; i < testCase.Length; i++)
G[(i / 32)] += (uint)(((testCase & 1)) (i % 32)) | 70);
Console.WriteLine(testCase);
Console.WriteLine(gTestCase);
if (testCase == gTestCase)
Console.WriteLine("OK.");
}
}
Это может звучать глупо, но относительно того, как я могу улучшить алгоритм, чтобы это 256-битное десятичное число можно было дополнительно сжать, у меня есть следующая идея:
(Примечание: ниже представлены разные темы для обсуждения, но они связаны с дальнейшим сжатием 256 байт)
Из моего понимания реализации Microsoft Decimal,
96-бит + 96-бит = 128-битный десятичный код.
Это означает, что 192-байтовая строка, содержащая любые два различных символа, может быть закодирована как 128-битное число вместо 192-битного числа. Верно?
Мои вопросы:
- Может ли Я делаю то же самое с 256-байтовыми строками?
(путем разделения каждого из них на пару двух чисел перед добавлением этих двух в виде десятичного числа короче 256-битного числа) )? - Как расшифровать вышеупомянутое 128-битное десятичное число обратно в пару двух 96-битных чисел, сохраняя при этом размер сжатых данных менее 192 бит?
Извините за мой предыдущий довольно расплывчатый вопрос.
Следующий код покажет, как сложить два 96-символьных кода. «Двоичные» строки как 128-символьные двоичные файлы строка.
public static string AddBinary(string a, string b) // 96-char binary strings
{
int[] x = { 0, 0, 0 };
int[] y = { 0, 0, 0 };
string c = String.Empty;
for (int z = 0; z < a.Length; z++)
x[(z / 32)] |= ((byte)(a[a.Length - z - 1]) & 1) (z % 32)) | 48);
return c.Contains("1") ? c.TrimStart('0') : "0";
}
Подробнее здесь: https://stackoverflow.com/questions/593 ... ly-f-and-g