gchq/CyberChef · error · OperationError

Unknown Frame Identifier: ${id}

Error message

Unknown Frame Identifier: ${id}

What it means

Thrown by the Extract ID3 operation when a frame identifier read from the ID3 tag is not found in the known FRAME_DESCRIPTIONS dictionary and is not the null-padding terminator. The parser walks frames sequentially; an unrecognized 3- or 4-byte ID indicates either tag corruption, an unsupported/proprietary frame type, or a parsing desync from a malformed earlier frame.

Source

Thrown at src/core/operations/ExtractID3.mjs:132

            // Frame Identifier of frame
            let id = String.fromCharCode(input[0]) + String.fromCharCode(input[1]) + String.fromCharCode(input[2]);
            input = input.slice(3);

            // If the next character is non-zero it is an identifier
            if (input[0] !== 0) {
                id += String.fromCharCode(input[0]);
            }
            input = input.slice(1);

            if (id in FRAME_DESCRIPTIONS) {
                const [frame, size] = readFrame(id);
                tags[id] = frame;
                pos += 10 + size;
            } else if (id === "\x00\x00\x00") { // end of header
                break;
            } else {
                throw new OperationError("Unknown Frame Identifier: " + id);
            }
        }

        result.Tags = tags;

        return result;
    }

    /**
     * Displays the extracted data in a more accessible format for web apps.
     * @param {JSON} data
     * @returns {html}
     */
    present(data) {
        if (!data || !Object.prototype.hasOwnProperty.call(data, "Tags"))
            return JSON.stringify(data, null, 4);

        let output = `<table class="table table-hover table-sm table-bordered table-nonfluid">

View on GitHub (pinned to 4290ea7539)

Solutions

  1. Verify the MP3 file has a well-formed, standard ID3v2 tag (v2.2–v2.4).
  2. Try re-tagging the file with a standard tag editor to remove custom/proprietary frames.
  3. Use the Extract Audio Metadata operation which has more robust ID3 parsing.
  4. Inspect the raw bytes around the reported frame offset to identify corruption.

Example fix

// before: MP3 with corrupted/custom frame ID 'XXYZ' -> error

// after: re-save MP3 with standard ID3v2.3 frames using a tag editor
Defensive patterns

Strategy: try-catch

Try / catch

try {
  const result = chef.extractID3(input);
} catch (e) {
  if (e.message.startsWith('Unknown Frame Identifier')) {
    // Tag may contain proprietary frames or be corrupt; use Extract Audio Metadata instead
  } else throw e;
}

Prevention

When it happens

Trigger: run(input, args) inside the while loop (line 113) processing frames. A frame ID assembled from input bytes does not match any key in FRAME_DESCRIPTIONS and is not '\x00\x00\x00' (end-of-header padding), reaching the else branch at line 131.

Common situations: Corrupted or truncated ID3 tags, custom/proprietary frame types not in the standard list, or a desync caused by incorrect size decoding of a preceding frame shifting the read position. Also with ID3v2.4 extended headers or unsynchronisation that the parser does not handle.

Related errors


AI-assisted analysis of gchq/CyberChef@4290ea7539 (2026-08-13). Data as JSON: /api/errors/37d7b3a61dbb2db2. Report an issue: GitHub.