/**
* ⚡ IHK BINÄRPRÄFIX- & TRANSFERZEIT-DRILL (IEC 60027-2) ⚡
* ======================================================
* Interaktiver Drill für:
* 1. Binärpräfixe (KiB, MiB, GiB, TiB) vs. Dezimalpräfixe (kB, MB, GB, TB)
* 2. Berechnen der tatsächlichen Speicherkapazität (Herstellerangabe vs. Betriebssystem)
* 3. Übertragungszeit-Berechnung t = Datenmenge / Datenrate mit Einheitenkonvertierung
*/
class PrefixConverter {
constructor(containerId) {
this.container = document.getElementById(containerId);
this.init();
}
init() {
if (!this.container) return;
this.render();
}
render() {
this.container.innerHTML = `
`;
this.attachEvents();
}
attachEvents() {
const tabDrill = document.getElementById("pfx-tab-drill");
const tabTime = document.getElementById("pfx-tab-time");
const viewDrill = document.getElementById("pfx-view-drill");
const viewTime = document.getElementById("pfx-view-time");
tabDrill.addEventListener("click", () => {
tabDrill.className = "ihk-btn ihk-btn-primary";
tabTime.className = "ihk-btn ihk-btn-secondary";
viewDrill.style.display = "block";
viewTime.style.display = "none";
});
tabTime.addEventListener("click", () => {
tabTime.className = "ihk-btn ihk-btn-primary";
tabDrill.className = "ihk-btn ihk-btn-secondary";
viewTime.style.display = "block";
viewDrill.style.display = "none";
});
document.getElementById("btn-calc-pfx").addEventListener("click", () => this.calcCapacity());
document.getElementById("btn-calc-time").addEventListener("click", () => this.calcTime());
}
calcCapacity() {
const val = parseFloat(document.getElementById("pfx-disk-val").value) || 0;
const unit = document.getElementById("pfx-disk-unit").value;
const resBox = document.getElementById("pfx-disk-result");
resBox.style.display = "block";
let bytes = 0;
if (unit === "GB") bytes = val * 1e9;
if (unit === "TB") bytes = val * 1e12;
const gib = bytes / Math.pow(1024, 3);
const tib = bytes / Math.pow(1024, 4);
const diffPct = (1 - (gib / (unit === "TB" ? val * 1024 : val))) * 100;
resBox.innerHTML = `
| Hersteller-Angabe: | ${val} ${unit} = ${bytes.toLocaleString()} Byte |
| Nutzbare Kapazität in GiB (IEC): | ${gib.toFixed(2)} GiB |
| Nutzbare Kapazität in TiB (IEC): | ${tib.toFixed(3)} TiB |
| Scheinbarer Verlust durch Präfix-Unterschied: | ca. ${unit === 'TB' ? '9,09 %' : '6,87 %'} |
💡 IHK-Prüfungsbegründung: Das Betriebssystem rechnet mit der Basis 1.024 (${unit === 'TB' ? '1.024⁴' : '1.024³'}). Es handelt sich um keinen physischen Datenverlust, sondern eine Diskrepanz zwischen SI- und IEC-Standard.
`;
}
calcTime() {
const amount = parseFloat(document.getElementById("pfx-data-amount").value) || 0;
const unit = document.getElementById("pfx-data-unit").value;
const speed = parseFloat(document.getElementById("pfx-net-speed").value) || 0;
const speedUnit = document.getElementById("pfx-speed-unit").value;
const overheadPct = parseFloat(document.getElementById("pfx-overhead").value) || 0;
let bytes = 0;
if (unit === "MiB") bytes = amount * Math.pow(1024, 2);
if (unit === "GiB") bytes = amount * Math.pow(1024, 3);
if (unit === "TiB") bytes = amount * Math.pow(1024, 4);
let totalBits = bytes * 8 * (1 + overheadPct / 100);
let bitsPerSec = 0;
if (speedUnit === "Mbit") bitsPerSec = speed * 1e6;
if (speedUnit === "Gbit") bitsPerSec = speed * 1e9;
const seconds = totalBits / bitsPerSec;
const minutes = seconds / 60;
const hours = minutes / 60;
const resBox = document.getElementById("pfx-time-result");
resBox.style.display = "block";
let timeString = "";
if (hours >= 1) {
const h = Math.floor(hours);
const m = Math.floor((hours - h) * 60);
const s = Math.round(seconds % 60);
timeString = `${h} Stunden, ${m} Minuten, ${s} Sekunden`;
} else if (minutes >= 1) {
const m = Math.floor(minutes);
const s = Math.round(seconds % 60);
timeString = `${m} Minuten, ${s} Sekunden`;
} else {
timeString = `${seconds.toFixed(1)} Sekunden`;
}
resBox.innerHTML = `
| Datenmenge (inkl. ${overheadPct}% Overhead): | ${(totalBits / 8 / 1024 / 1024).toFixed(1)} MiB (${(totalBits / 1e6).toFixed(0)} Mbit) |
| Nettoreichweite Übertragung: | ${speed} ${speedUnit}/s |
| Berechnete Übertragungsdauer (t): | ${timeString} (${seconds.toFixed(1)} s) |
`;
}
}
document.addEventListener("DOMContentLoaded", () => {
if (document.getElementById("prefix-converter-container")) {
window.prefixConverter = new PrefixConverter("prefix-converter-container");
}
});