我有一些二进制数据。我会随着时间的推移而改变,有些字节会在这里添加,有些会被改变。总体而言,大多数bytearray保持不变。
是否有任何库,最好是Actionscript 3,从两个bytearray中生成一个“changeset”(有更好的名字吗?)。此外,它应该让我将变更集应用于bytearray并返回生成的新bytearray。
这有意义吗?我不确定如何最好地制定我的问题。
澄清澄清:
我想要的是只发出变化的东西,从而使“变更集”尽可能小。因此,如果只有1KB的1MB二进制文件发生了变化,那么变更集应该是一个大约1KB大小的字节数组。
编辑:
基本上我需要一个AS3版本http://www.daemonology.net/bsdiff/我认为
答案 0 :(得分: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);
}
}
}