{"record":{"id":"3b8255046d4dcadc","repo":"gchq/CyberChef","slug":"starting-at-must-be-a-positive-or-zero-integer-3b8255","errorCode":null,"errorMessage":"'Starting at' must be a positive or zero integer.","messagePattern":"'Starting at' must be a positive or zero integer\\.","errorType":"exception","errorClass":"OperationError","httpStatus":null,"severity":"error","filePath":"src/core/operations/TakeNthBytes.mjs","lineNumber":60,"sourceCode":"            }\n        ];\n    }\n\n    /**\n     * @param {byteArray} input\n     * @param {Object[]} args\n     * @returns {byteArray}\n     */\n    run(input, args) {\n        const n = args[0];\n        const start = args[1];\n        const eachLine = args[2];\n\n        if (parseInt(n, 10) !== n || n <= 0) {\n            throw new OperationError(\"'Take every' must be a positive integer.\");\n        }\n        if (parseInt(start, 10) !== start || start < 0) {\n            throw new OperationError(\"'Starting at' must be a positive or zero integer.\");\n        }\n\n        let offset = 0;\n        const output = [];\n        for (let i = 0; i < input.length; i++) {\n            if (eachLine && input[i] === 0x0a) {\n                output.push(0x0a);\n                offset = i + 1;\n            } else if (i - offset >= start && (i - (start + offset)) % n === 0) {\n                output.push(input[i]);\n            }\n        }\n\n        return output;\n    }\n\n}\n","sourceCodeStart":42,"sourceCodeEnd":78,"githubUrl":"https://github.com/gchq/CyberChef/blob/4290ea753912378913b1f3f54e0fc5720afeda5d/src/core/operations/TakeNthBytes.mjs#L42-L78","documentation":"Take Nth Bytes requires the 'Starting at' argument (start) to be a non-negative integer. The guard rejects fractional values and any value below 0, since a negative or fractional start offset has no defined meaning for byte indexing.","triggerScenarios":"Passing a negative number or a non-integer for the 'Starting at' argument, or a NaN/string that fails the parseInt identity test.","commonSituations":"Entering -1 intending 'from the end' (not supported), leaving a decimal, or supplying an empty value that resolves to an invalid offset.","solutions":["Enter a zero-or-greater integer such as 0, 5, or 100 for 'Starting at'.","Use 0 to start from the first byte.","Remove any negative sign or fractional part from the field."],"exampleFix":"// before: args[1] (Starting at) = -3  -> throws\n// after:  args[1] (Starting at) = 3   -> begins sampling at byte index 3","handlingStrategy":"type-guard","validationCode":"const start = args[1];\nif (!(Number.isInteger(start) && start >= 0)) {\n  throw new Error(\"'Starting at' must be >= 0 integer\");\n}","typeGuard":"const isNonNegInt = v => Number.isInteger(v) && v >= 0;","tryCatchPattern":"try { takeNthBytes(input, n, start, eachLine); }\ncatch (e) { if (/Starting at/.test(e.message)) { /* set start to 0 */ } else throw e; }","preventionTips":["Default the start field to 0.","Use Number.isInteger to guard offsets.","Reject negative offsets in form validation."],"tags":["validation","argument","integer","bytes"],"backgroundTag":null,"analyzedSha":"4290ea753912378913b1f3f54e0fc5720afeda5d","analyzedAt":"2026-08-13T06:05:50.210Z","schemaVersion":2},"datasetVersion":"2026-08-13T09:17:06.757Z"}