1

我有一些二进制数据。我会随着时间的推移而改变,一些字节会在这里和那里添加,一些会改变。总体而言,大部分字节数组保持不变。

是否有任何库,最好是 Actionscript 3,从两个字节数组中生成一个“变更集”(有更好的名称吗?)。它还应该让我将变更集应用于字节数组并返回生成的新字节数组。

这有意义吗?我不确定如何最好地表述我的问题。

编辑澄清:

我想要的是只发出变化的东西,从而使“变更集”尽可能小。因此,如果 1MB 二进制文件中只有 1KB 发生了变化,那么变更集应该是一个大小约为 1KB 的字节数组。

编辑:

我认为基本上我需要一个http://www.daemonology.net/bsdiff/的 AS3 版本

4

1 回答 1

0

我不知道任何 AS3 库,但如果我理解正确的话,从头开始编写代码并不像你想象的那么困难或耗时。这是我的(天真)方法。也许这已经符合您的需求。

示例输出

示例输出

代码

package {
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.utils.ByteArray;

    public class Main extends Sprite {

        public function Main():void {
            if (stage)
                init();
            else
                addEventListener(Event.ADDED_TO_STAGE, init);
        }


        private function createDiff(original:ByteArray, comparedTo:ByteArray):ByteArray {
            var diff:ByteArray = new ByteArray();
            var length:uint = Math.min(original.length, comparedTo.length);
            original.position = 0;
            comparedTo.position = 0;
            for (var i:int = 0; i < length; i++) {
                var byteOriginal:int = original.readByte();
                var byteComparedTo:int = comparedTo.readByte();
                if (byteOriginal != byteComparedTo) {
                    diff.writeByte(byteComparedTo - byteOriginal);
                }
                else {
                    diff.writeByte(0);
                }
            }
            diff.compress();
            return diff;
        }

        private function applyDiff(original:ByteArray, diff:ByteArray):ByteArray {
            var result:ByteArray = new ByteArray();
            diff.uncompress();
            original.position = 0;
            diff.position = 0;
            var length:uint = Math.min(original.length, diff.length);
            for (var i:uint = 0; i < length; i++) {
                var byteOriginal:int = original.readByte();
                var byteDiff:int = diff.readByte();
                result.writeByte(byteOriginal + byteDiff);
            }
            return result;
        }

        private function init(e:Event = null):void {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // generate one random byte array and a slightly different variant
            var length:uint = 128;
            var a:ByteArray = new ByteArray();
            var b:ByteArray = new ByteArray();
            for (var i:int = 0; i < length; i++) {
                var value:int;
                value = 127 - Math.floor(Math.random() * 256);
                a.writeByte(value);
                if (value > 64) {
                    value = 127 - Math.floor(Math.random() * 256);
                }
                b.writeByte(value);
            }
            // create a diff and apply it to the original byte array for verification
            var diff:ByteArray = createDiff(a, b);
            var result:ByteArray = applyDiff(a, diff);
            // trace the byte arrays
            a.position = 0;
            b.position = 0;
            diff.position = 0;
            result.position = 0;
            var outputA:String = "";
            var outputB:String = "";
            var outputDiff:String = "";
            var outputResult:String = "";
            for (var k:int = 0; k < length; k++) {
                outputA += a.readByte() + "\t";
                outputB += b.readByte() + "\t";
                outputDiff += diff.readByte() + "\t";
                outputResult += result.readByte() + "\t";
            }
            trace("1st: \t" + outputA);
            trace("2nd: \t" + outputB);
            trace("diff:\t" + outputDiff);
            trace("test:\t" + outputResult);
        }

    }

}
于 2012-07-26T15:44:47.533 回答