From 5225874498d8ef15eafce5e5389d40f96c54ad4a Mon Sep 17 00:00:00 2001 From: mshwed Date: Sun, 28 Apr 2019 14:38:03 -0400 Subject: [PATCH] Fixed handling of large files and fixed issue with line histogram colour fill --- src/core/operations/AdvancedEntropy.mjs | 33 ++++++++++++++----------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/src/core/operations/AdvancedEntropy.mjs b/src/core/operations/AdvancedEntropy.mjs index d7cbd8c1..e60816ac 100644 --- a/src/core/operations/AdvancedEntropy.mjs +++ b/src/core/operations/AdvancedEntropy.mjs @@ -73,9 +73,9 @@ class AdvancedEntropy extends Operation { */ calculateScanningEntropy(inputBytes, binWidth) { const entropyData = []; - binWidth = binWidth ? - Math.floor(inputBytes.length / binWidth) : - Math.floor(inputBytes.length / 256); + + if (inputBytes.length < 256) binWidth = 8; + else binWidth = 256; for (let bytePos = 0; bytePos < inputBytes.length; bytePos+=binWidth) { const block = inputBytes.slice(bytePos, bytePos+binWidth); @@ -145,14 +145,15 @@ class AdvancedEntropy extends Operation { calculateByteFrequency(inputBytes) { const byteFrequency = []; for (let i = 0; i < 256; i++) { - let count = 0; - for (const byte of inputBytes) { - if (byte === i) { - count++; + if (inputBytes.length > 0) { + let count = 0; + for (const byte of inputBytes) { + if (byte === i) count++; } + byteFrequency.push(count / inputBytes.length); + } else { + byteFrequency.push(0); } - - byteFrequency.push(count / (inputBytes.length + 1)); } return byteFrequency; @@ -179,7 +180,7 @@ class AdvancedEntropy extends Operation { .attr("viewBox", `0 0 ${svgWidth} ${svgHeight}`); const yScale = d3.scaleLinear() - .domain(d3.extent(byteFrequency, d => d)) + .domain([0, d3.max(byteFrequency, d => d)]) .range([svgHeight - margins.bottom, margins.top]); const xScale = d3.scaleLinear() @@ -193,8 +194,9 @@ class AdvancedEntropy extends Operation { svg.append("path") .datum(byteFrequency) - .attr("d", line) - .attr("fill", "steelblue"); + .attr("fill", "none") + .attr("stroke", "steelblue") + .attr("d", line); this.createAxes(svg, xScale, yScale, svgHeight, svgWidth, margins, "", "Byte", "Byte Frequency"); @@ -221,8 +223,9 @@ class AdvancedEntropy extends Operation { .attr("height", "100%") .attr("viewBox", `0 0 ${svgWidth} ${svgHeight}`); + const yExtent = d3.extent(byteFrequency, d => d); const yScale = d3.scaleLinear() - .domain(d3.extent(byteFrequency, d => d)) + .domain(yExtent) .range([svgHeight - margins.bottom, margins.top]); const xScale = d3.scaleLinear() @@ -235,7 +238,7 @@ class AdvancedEntropy extends Operation { .attr("x", (_, i) => xScale(i) + binWidth) .attr("y", dataPoint => yScale(dataPoint)) .attr("width", binWidth) - .attr("height", dataPoint => yScale(0) - yScale(dataPoint)) + .attr("height", dataPoint => yScale(yExtent[0]) - yScale(dataPoint)) .attr("fill", "blue"); this.createAxes(svg, xScale, yScale, svgHeight, svgWidth, margins, "", "Byte", "Byte Frequency"); @@ -350,7 +353,7 @@ class AdvancedEntropy extends Operation { } else if (visualizationType === "Curve") { return this.createEntropyCurve(this.calculateScanningEntropy(input).entropyData); } else if (visualizationType === "Image") { - return this.createEntropyImage(this.calculateScanningEntropy(input, 10000).entropyData); + return this.createEntropyImage(this.calculateScanningEntropy(input).entropyData); } } }