5

アルゴリズムを使用して、XMバイトの「非圧縮」データシーケンスを生成したいと思います。VPN接続を介してネットワーク速度を測定するプログラムを作成するために(vpn組み込みの圧縮を回避するために)そのようにしたいと思います。

誰か助けてもらえますか?ありがとう!

PS。アルゴリズムが必要です。圧縮できなくなったファイルを使用しましたが、プログラムでデータシーケンスを最初から生成する必要があります。

4

8 に答える 8

8

ホワイトノイズデータは真にランダムであるため、非圧縮性です。

したがって、それを生成するアルゴリズム(または近似値)を見つける必要があります。

Linuxでこれを試してください:

# dd if=/dev/urandom bs=1024 count=10000 2>/dev/null | bzip2 -9 -c -v > /dev/null
(stdin): 0.996:1, 8.035 bits/byte, -0.44% saved, 10240000 in, 10285383 out.

ただし、任意の種類の乱数生成を試すことができます...

于 2012-02-07T23:08:45.593 に答える
7

統計的に圧縮が難しいデータを作成するための簡単なアプローチの1つは、乱数ジェネレーターを使用することです。繰り返し可能にする必要がある場合は、シードを修正します。適度に優れた乱数ジェネレーターならどれでもかまいません。皮肉なことに、乱数ジェネレーターを知っていれば、結果は信じられないほど圧縮可能です。存在する情報はシードだけです。ただし、実際の圧縮方法は無効になります。

于 2012-02-07T23:07:31.723 に答える
3

次の2つのオプションがあります。1。適切な疑似乱数ジェネレーターを使用する2.AESのような暗号化機能を使用する(実装はどこにでもあります)

アルゴ

  1. 好きなキーを考えてください。すべてゼロで問題ありません。
  2. 空のブロックを作成する
  3. キーを使用してブロックを暗号化する
  4. ブロックを出力する
  5. さらにデータが必要な場合は、3に進んでください

正しく行われると、生成するデータストリームは数学的にランダムノイズと区別できなくなります。

于 2012-02-07T23:08:28.810 に答える
3

他の回答では、ランダムノイズは非圧縮性であり、優れた暗号化関数は、ランダムノイズに可能な限り近い出力を持っていると指摘しています(復号化キーを知らない限り)。したがって、良いアプローチは、乱数ジェネレーターまたは暗号化アルゴリズムを使用して非圧縮性データを生成することです。

真に非圧縮性(任意の圧縮アルゴリズムによる)のビット文字列が存在します(「非圧縮性」の特定の正式な定義の場合)が、それらを認識することさえ、それらを生成することは言うまでもなく、計算上決定不可能です。

ただし、「ランダムデータ」は、考えられるすべてのランダムデータに対して平均1:1を超える圧縮率を達成できる圧縮アルゴリズムがないという点でのみ、非圧縮性であることに注意してください。ただし、ランダムに生成された特定の文字列の場合、適切な圧縮率を実現する特定の圧縮アルゴリズムが存在する可能性があります。結局のところ、すべてのゼロのような愚かなものを含め、圧縮可能な文字列はランダムジェネレータから出力できるはずですが、可能性は低いです。

したがって、乱数ジェネレーターまたは暗号化アルゴリズムから「圧縮可能な」データを取得する可能性はおそらくほとんどありませんが、実際にデータをテストしてから使用したいと思います。VPN接続で使用される圧縮アルゴリズムにアクセスできる場合は、それが最適です。圧縮されないものが得られるまで、ランダムにデータを生成するだけです。それ以外の場合は、いくつかの一般的な圧縮ツールを実行して、サイズが減少しないことを確認するだけで十分です。

于 2012-02-07T23:27:00.940 に答える
2

次のプログラム (C/POSIX) は、非圧縮データをすばやく生成します。これは、1 秒あたりのギガバイト範囲にあるはずです。一般的なアイデアを使用してさらに高速化することは可能だと確信しています (おそらく、SIMD で Djb の ChaCha コアを使用しますか?)。

/* public domain, 2013 */

#include <stdint.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>

#define R(a,b) (((a) << (b)) | ((a) >> (32 - (b))))
static void salsa_scrambler(uint32_t out[16], uint32_t x[16])
{
    int i;
    /* This is a quickly mutilated Salsa20 of only 1 round */
    x[ 4] ^= R(x[ 0] + x[12],  7);
    x[ 8] ^= R(x[ 4] + x[ 0],  9);
    x[12] ^= R(x[ 8] + x[ 4], 13);
    x[ 0] ^= R(x[12] + x[ 8], 18);
    x[ 9] ^= R(x[ 5] + x[ 1],  7);
    x[13] ^= R(x[ 9] + x[ 5],  9);
    x[ 1] ^= R(x[13] + x[ 9], 13);
    x[ 5] ^= R(x[ 1] + x[13], 18);
    x[14] ^= R(x[10] + x[ 6],  7);
    x[ 2] ^= R(x[14] + x[10],  9);
    x[ 6] ^= R(x[ 2] + x[14], 13);
    x[10] ^= R(x[ 6] + x[ 2], 18);
    x[ 3] ^= R(x[15] + x[11],  7);
    x[ 7] ^= R(x[ 3] + x[15],  9);
    x[11] ^= R(x[ 7] + x[ 3], 13);
    x[15] ^= R(x[11] + x[ 7], 18);
    for (i = 0; i < 16; ++i)
        out[i] = x[i];
}

#define CHUNK 2048

int main(void)
{
    uint32_t bufA[CHUNK];
    uint32_t bufB[CHUNK];
    uint32_t *input = bufA, *output = bufB;
    int i;

    /* Initialize seed */
    srand(time(NULL));
    for (i = 0; i < CHUNK; i++)
        input[i] = rand();

    while (1) {
        for (i = 0; i < CHUNK/16; i++) {
            salsa_scrambler(output + 16*i, input + 16*i);
        }
        write(1, output, sizeof(bufA));

        {
            uint32_t *tmp = output;
            output = input;
            input = tmp;
        }
    }
    return 0;
}
于 2013-02-28T02:07:36.790 に答える
-1

非圧縮ファイルを作成する (非常に単純で最適化されていない) C# コンソール アプリケーションを作成しました。テキストファイル (拡張子 .txt) のフォルダーをスキャンし、テキストファイルごとに同じ名前とサイズのバイナリ ファイル (拡張子 .bin) を作成します。これが誰かに役立つことを願っています。C# コードは次のとおりです。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var files = Directory.EnumerateFiles(@"d:\MyPath\To\TextFile\", "*.txt");
            var random = new Random();
            foreach (var fileName in files)
            {
                var fileInfo = new FileInfo(fileName);
                var newFileName = Path.GetDirectoryName(fileName) + @"\" + Path.GetFileNameWithoutExtension(fileName) + ".bin";
                using (var f = File.Create(newFileName))
                {
                    long bytesWritten = 0;
                    while (bytesWritten < fileInfo.Length)
                    {
                        f.WriteByte((byte)random.Next());
                        bytesWritten++;
                    }
                    f.Close();
                }
            }
        }
    }
}
于 2013-10-02T08:55:41.603 に答える