{"id":25626837,"url":"https://github.com/facekapow/struffer","last_synced_at":"2026-04-10T11:32:39.412Z","repository":{"id":57372975,"uuid":"136682611","full_name":"facekapow/struffer","owner":"facekapow","description":"Struct + Buffer = Struffer. Also works with Uint8Arrays","archived":false,"fork":false,"pushed_at":"2018-06-20T16:08:08.000Z","size":52,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-07-30T18:39:50.541Z","etag":null,"topics":["buffer","data","javascript","node","node-js","nodejs","struct","structure","structured-data","typescript","uint8array"],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/facekapow.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-06-09T02:03:40.000Z","updated_at":"2023-09-26T18:14:17.000Z","dependencies_parsed_at":"2022-08-29T14:43:18.628Z","dependency_job_id":null,"html_url":"https://github.com/facekapow/struffer","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/facekapow/struffer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/facekapow%2Fstruffer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/facekapow%2Fstruffer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/facekapow%2Fstruffer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/facekapow%2Fstruffer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/facekapow","download_url":"https://codeload.github.com/facekapow/struffer/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/facekapow%2Fstruffer/sbom","scorecard":{"id":390988,"data":{"date":"2025-08-11","repo":{"name":"github.com/facekapow/struffer","commit":"4bebd0d9e058c9a9a87caff1e59e2ea9bbbd4fbc"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":1.5,"checks":[{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 0/6 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v1.0.1 not signed: https://api.github.com/repos/facekapow/struffer/releases/11572131","Warn: release artifact v1.0.0 not signed: https://api.github.com/repos/facekapow/struffer/releases/11421820","Warn: release artifact v1.0.1 does not have provenance: https://api.github.com/repos/facekapow/struffer/releases/11572131","Warn: release artifact v1.0.0 does not have provenance: https://api.github.com/repos/facekapow/struffer/releases/11421820"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":0,"reason":"45 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-67hx-6x53-jw92","Warn: Project is vulnerable to: GHSA-v88g-cgmw-v5xw","Warn: Project is vulnerable to: GHSA-93q8-gq69-wqmw","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-w573-4hg7-7wgq","Warn: Project is vulnerable to: GHSA-qrmc-fj45-qfc2","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-q42p-pg8m-cqh6","Warn: Project is vulnerable to: GHSA-w457-6q6x-cgp9","Warn: Project is vulnerable to: GHSA-62gr-4qp9-h98f","Warn: Project is vulnerable to: GHSA-f52g-6jhx-586p","Warn: Project is vulnerable to: GHSA-2cf5-4w76-r9qv","Warn: Project is vulnerable to: GHSA-3cqr-58rm-57f8","Warn: Project is vulnerable to: GHSA-g9r4-xpmj-mj65","Warn: Project is vulnerable to: GHSA-q2c6-c6pm-g3gh","Warn: Project is vulnerable to: GHSA-765h-qjxv-5f44","Warn: Project is vulnerable to: GHSA-f2jv-r9rf-7988","Warn: Project is vulnerable to: GHSA-43f8-2h32-f4cj","Warn: Project is vulnerable to: GHSA-2pr6-76vf-7546","Warn: Project is vulnerable to: GHSA-8j8c-7jfh-h6hx","Warn: Project is vulnerable to: GHSA-896r-f27r-55mw","Warn: Project is vulnerable to: GHSA-6c8f-qphg-qjgp","Warn: Project is vulnerable to: GHSA-4xc9-xhrj-v574","Warn: Project is vulnerable to: GHSA-x5rq-j2xg-h7qm","Warn: Project is vulnerable to: GHSA-jf85-cpcp-j695","Warn: Project is vulnerable to: GHSA-p6mc-m468-83gw","Warn: Project is vulnerable to: GHSA-29mw-wpgm-hmr9","Warn: Project is vulnerable to: GHSA-35jh-r3h4-6jhm","Warn: Project is vulnerable to: GHSA-4xcv-9jjx-gfj3","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-f8q6-p94x-37v3","Warn: Project is vulnerable to: GHSA-vh95-rmgr-6w4m","Warn: Project is vulnerable to: GHSA-xvch-5gv4-984h","Warn: Project is vulnerable to: GHSA-fhjf-83wg-r2j9","Warn: Project is vulnerable to: GHSA-hj48-42vr-x3v9","Warn: Project is vulnerable to: GHSA-hrpp-h998-j3pp","Warn: Project is vulnerable to: GHSA-p8p7-x288-28g6","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-4g88-fppr-53pp","Warn: Project is vulnerable to: GHSA-4jqc-8m5r-9rpr","Warn: Project is vulnerable to: GHSA-72xf-g2v4-qvf3","Warn: Project is vulnerable to: GHSA-c4w7-xm78-47vh","Warn: Project is vulnerable to: GHSA-p9pc-299p-vxgp"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-18T17:48:19.761Z","repository_id":57372975,"created_at":"2025-08-18T17:48:19.761Z","updated_at":"2025-08-18T17:48:19.761Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31641114,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-10T07:40:12.752Z","status":"ssl_error","status_checked_at":"2026-04-10T07:40:11.664Z","response_time":98,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["buffer","data","javascript","node","node-js","nodejs","struct","structure","structured-data","typescript","uint8array"],"created_at":"2025-02-22T17:17:42.137Z","updated_at":"2026-04-10T11:32:39.393Z","avatar_url":"https://github.com/facekapow.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Struffer\n[![Travis CI Build Status](https://img.shields.io/travis/facekapow/struffer.svg?style=for-the-badge)](https://travis-ci.org/facekapow/struffer)\n[![Coveralls.io Test Coverage Status](https://img.shields.io/coveralls/github/facekapow/struffer.svg?style=for-the-badge)](https://coveralls.io/github/facekapow/struffer)\n[![Package version](https://img.shields.io/github/package-json/v/facekapow/struffer.svg?style=for-the-badge)](https://www.npmjs.com/package/struffer)\n\nStruct + Buffer = Struffer.\nAlso works with Uint8Arrays\n\nWhy? Because Buffers (and Uint8Arrays) are great, but manipulating data with them is highly \nunconfortable. Struffers overlay a structure definition (that you provide) to easily\ninteract with data in Buffers.\n\n## Install\nAs simple as 1, 2, 3:\n\n```bash\nnpm install --save struffer\n```\n\n## API\nStruffers come in two flavors: normal and advanced. Both share the same exact API and are\nalmost identical. The only difference is normal struffers require members to be sized\nin multiples of eight (8, 16, 32, etc.) while advanced struffers allow members to be\narbitrary bit sizes (3, 17, 22, etc.). Advanced struffers are recommended if you're looking\nto cut down on size and know the exact limit of the values you'll be using. Normal struffers \nare recommended for pretty much everything else (since they enforce standard bit sizes).\n\n:warning: Wait! :warning: If you're like me and learn best by reading through some code, head\non over to the [examples](examples/README.md). Otherwise, keep reading and enjoy.\n\nAll API examples here are done using normal struffers, but for advanced struffers, just replace\nthe `Struffer` factory with `AdvancedStruffer`.\n\nBy the way, the examples here are all based on previous ones. So if you're lost as to where a piece of\nan example came from, look at examples before it.\n\n```ts\n// pick your poison\nimport Struffer, { AdvancedStruffer } from 'struffer';\n```\n\n### Template Creation\nDefining a struffer layout is extremely simple and as similar as possible to defining a struct in C.\nAs mentioned before, normal struffers can only use sizes that are multiples of eight. Since examples\nare done with normal struffers, we'll be following this limitation. Keep in mind, though, that advanced\nstruffers can use any bit size in place of sizes in these examples.\n\nTemplates (i.e. your custom struffer classes) can be created by calling the factory for your desired\nstruffer flavor (`Struffer` or `AdvancedStruffer`) with 2 arguments: the name for your template and\nthe layout definition.\n\nThe layout definition is an array of `[string, string]`. Each tuple represents one member. The first\nstring in each tuple is the member's type (more on that in a bit). The second string in\neach tuple is the member's name.\n\nTypes are nearly identical to C types, but with a few improvements. First off, they can be upper- or\nlowercase, it doesn't matter. They can be simple words like `int`, `uint`, `byte`, and `char`, or\nthey can be abbreviations like `i` and `u`. `uint` and `u` are special in that (if not overridden by\na `signed` modifier) they are `unsigned`. Types can also have a size manually specified by putting it\nafter the type name (e.g. `int_16`, `u64`, `char 80`, etc.).\n\nTypes can include modifiers at the before the type name like `signed`, `unsigned`, `short`, and `long`.\n`signed` and `unsigned` modify the signature of the type (i.e. exactly what they do in C). But unlike\ntheir C counterparts, `short` and `long` don't strictly set a type size. Instead, `short` divides the\ntype size by 2, and `long` multiplies it by 2. The number of times you specify them also matters. For\nexample, `int`s are 32 bits. Doing `long int` makes it 64 bits. Doing `long long int` makes it 128 bits.\nThe same applies to `short`s.\n\nThe last 2 modifiers available are endianness specifiers, and they go *after* the type name (and type\nsize, if included). They're `le` for little-endian and `be` for big-endian. Types are by default\nlittle-endian.\n\nModifiers, type names, and type sizes can all be separated by any non-alphanumeric character. Thus,\n`unsigned int 32` is the same as `unsigned_int_32`. Each separator can also be different from other\nseparators, so `unsigned int_32` works. However, note the careful wording: they *can* be separated by\nsuch characters, but they don't *have* to. `unsignedint32`, while hardly readable, is perfectly valid.\n\nGot all that? Yes? No? How about an example to help explain? Here you go:\n\n```ts\nconst MyStruffer = Struffer('MyStruffer', [\n  ['int', 'foo'],\n  ['unsigned int', 'bar'],\n  ['short uint be', 'foobar'], // same as `u16be`\n  ['long long unsigned i16', 'some'], // same as `long uint` or `uint_64`\n  ['byte_32', 'thing'], // same as `int`\n  ['short long short int', 'something'], // same as `short int`\n  ['int le', 'cool'], // same as `int`\n  ['SIGNED U32 BE', 'WHY_AM_I_YELLING'], // same as `int be`\n  // you probably get the gist by now\n]);\n```\n\nAlright, well, that was lot, wasn't it? Don't worry, that was the hardest part. It's all downhill from\nhere.\n\n### Static Template Properties\nTemplates have 2 useful static properties:\n  * `byteLength` - The total length in bytes of your template. Will always be rounded up if your template\n    contains a partial byte (only possible in advanced struffers)\n  * `bitLength` - The total length in bits of your template\n  \n```ts\nMyStruffer.byteLength === 256;\nMyStruffer.bitLength === 2048;\n```\n\n### Template Instantiation\nYou can instantiate your template over a given `Buffer` or `Uint8Array` quite easily. Just pass in a\na `Buffer` or `Uint8Array` as your first argument, and if you need to, the offset where the structure\ndata should start. That's it.\n\n```ts\nconst someBuffer = Buffer.alloc(MyStruffer.byteLength);\nconst struff = new MyStruffer(someBuffer);\n\n// or you can offset it (say, for example, 8 bytes):\nconst someOtherBuffer = Buffer.alloc(MyStruffer.byteLength + 8);\nconst strufferWithAnOffset = new MyStruffer(someOtherBuffer, 8);\n```\n\n### Data Interaction\nOnce you have your template instance created, you can use in 3 different ways:\n  * The Object API\n  * The Map API\n  * The Batch API\n\nThere is one thing to note, however, and it's common across all 3 APIs: \"deleting\" only clears the value\nof the member(s) it's targeting (i.e. it sets it/them to 0).\n\n#### Object API\nInteract with your data as if it were located in a regular old JS object via the `structure` property on\nstruffers. There's pretty much nothing to explain here. Just pretend that your member names are property\nnames on the `structure` and interact with them as you would any other JS object. Here's an example:\n\n```ts\n// getting a member's value:\nstruff.structure.foobar;\n\n// setting a member's value:\nstruff.structure.foobar = 1234;\n\n// checking for a member's presence/existence:\n'foobar' in struff.structure;\n\n// \"deleting\" a member:\ndelete struff.structure.foobar;\n\n// enumerating members:\nObject.keys(struff.structure);\n\n// works with computed keys, too\n```\n\nBy the way, all this trickery is enabled by ES6 Proxies. (standards ftw!)\n\n#### Map API\nAllows you to interact with your data through Map methods like `get`, `set`, `has`, and more. In fact,\neach and every struffer `implements Map\u003cstring, number\u003e`. Thus, you can use the full Map API with struffers.\n\n```ts\n// getting a member's value:\nstruff.get('foobar');\n\n// setting a member's value:\nstruff.set('foobar', 1234);\n\n// checking for member's presence/existence:\nstruff.has('foobar');\n\n// \"deleting\" a member:\nstruff.delete('foobar');\n\n// enumerating members:\nstruff.keys();\n\n// you can also use all other Map methods and properties:\nstruff.size; // number of members in the struffer\nstruff.clear(); // \"deletes\" all members (i.e. sets all members to 0)\nstruff.entries(); // Iterator that yields tuples of `[name: string, value: number]` for each member\nstruff.forEach((value: number, key: string, map: MyStruffer) =\u003e undefined, optionalThisArgHere);\nstruff.values(); // Iterator that yields the numerical value of each member\nstruff[Symbol.iterator](); // same as `struff.entries()`; automatically called when doing the following:\nfor (const [name, value] of struff) { /* ... */ }\n```\n\n#### Batch API\nAllows you to interact with multiple members at once. This API is mainly provided for user convenience,\nsince it's actually just a simple layer over the Map API.\n\n```ts\n// get member values:\nconst { foo, bar, foobar } = struff.getMany(['foo', 'bar', 'foobar']);\n\n// set member values:\nstruff.setMany({\n  foo: -123456,\n  bar: 123456,\n  foobar: 1234,\n});\n\n// check for the presence/existence of multiple members:\nconst { foo: fooPresent, bar: barPresent, foobar: foobarPresent } = struff.hasMany(['foo', 'bar', 'foobar']);\n\n// \"delete\" members:\nstruff.deleteMany(['foo', 'bar', 'foobar']);\n```\n\n### String representations\nStruffers come with some useful default string representations, through `toString()`, `[Symbol.toPrimitive]()`,\nand `[util.inspect.custom]()`.\n\n```ts\nstruff.toString(); // manual `toString()` call\n`my struff: ${struff}`; // calls `[Symbol.toPrimitive]('default')`\nstruff + 'foobar'; // calls `[Symbol.toPrimitive]('string')`\nconsole.log(struff); // calls `[util.inspect.custom]()` in Node.js\n```\n\nThe repesentation looks a little something like this (though your values may vary):\n\n```\nStruffer\u003cMyStruffer\u003e {\n  foo: i32 = 0;\n  bar: u32 = 0;\n  foobar: u16be = 0;\n  some: u64 = 0;\n  thing: i32 = 0;\n  something: i16 = 0;\n  cool: i32 = 0;\n  WHY_AM_I_YELLING: i32be = 0;\n}\n```\n\n### Miscellaneous methods\nSome documentation for random methods that didn't really fit in any other section.\n\n#### `getBits(name: string): BinaryValue[]`\nGets the individual bits of the given member. NOTE: while this may (and probably will and should) change\nin a future version, the order of the returned bits is platform dependent and should be handled accordingly.\n\n```ts\nstruff.structure.foobar = 123456;\nconst bits = struff.getBits('foobar');\n/**\n * `bits` should be [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0]\n * on little-endian systems (reverse this for big-endian systems)\n */\n```\n\n#### `setBits(name: string, bits: BinaryValue[])`\nSets the individual bits of the given member. NOTE: see `getBits` above.\n\n```ts\n// reverse this array for big-endian systems\nstruff.setBits('foobar', [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0]);\n// struff.structure.foobar should now be 123456\n```\n\n#### `bits()`\nLike `values()`, but yields bit arrays instead of numerical values. If you want bits along with member\nnames see `bitEntries()`.\n\n```ts\nfor (const bitArray of struff.bits()) {\n  // ...\n}\n```\n\n#### `bitEntries()`\nLike `entries()`, but yields bit arrays instead of numerical values.\n\n```ts\nfor (const [name, bits] of struff.bitEntries()) {\n  // ...\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffacekapow%2Fstruffer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffacekapow%2Fstruffer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffacekapow%2Fstruffer/lists"}