binary
Utilities for accessing binary data and bit manipulation in Dart.
4.0.0
8.8K downloads/mo
#3098 most downloaded on pub.dev
matanlurey/binary.dart
What this package is like to depend on
Last release 2 years ago
no release in 18 months
Ships unpredictably
gaps range from 8 days to 3.1 years
Nearly every release is documented
notes for 23 of 23 stable releases
Nothing withdrawn
no release was ever pulled
10 years old
32 releases · first in 2017
0 releases in the last 12 months
see the full history below
Release timeline
32 releases · Feb 2017 to Sep 2024Releases
latest 32-
4.0.022 Sep 2024Release notes
Open source →4.0.0
Stable release!
Important
Version 4.0.0 has a large set of breaking changes, including removing the
vast majority of extension methods and boxed classes, in favor of using the
newer extension types feature in Dart. I would be opening to adding back
some deprecated methods, or alib/compat.dartfile if there is demand;
please file an issue if you need this.New features:
- Added
viewOrCopyAsBytes. - Added
BytesBuilderExtension.
Read the release notes below for a summary of changes.
4.0.0-beta
- Update Dart SDK to
^3.5.0.
4.0.0-alpha+7
- Added
<Int>.lsb. - Removed bit-operations from
IntExtension; they are too easy to use
incorrectly in the JS VM.
4.0.0-alpha+6
- Just kidding,
checkRangewill return{{Int}}if no error is thrown.
4.0.0-alpha+5
<Int>.checkRangereturns theintif no error was thrown (instead of
void).
4.0.0-alpha+4
- Actually publish the contents of
4.0.0-alpha+3.
4.0.0-alpha+3
New features:
- Added
<Int>.maxIntand<Int>.minIntas static (int) constants.
4.0.0-alpha+2
Breaking changes:
<FixedInt>, which was pointless, is now justint. That means that any
fixed integer representation can be provided somewhere anintis expected,
which cuts down on boilerplate without much value.
4.0.0-alpha+1
New features:
-
Added
BitList, a compactList<bool>implementation that stores every
element as a single bit, with implementations that are fixed-size and
growable. -
Added
<FixedInt>.zeroand<FixedInt>.oneas static constants. -
Added
collectBytes(), a utility to convert aStream<List<int>>into a
Uint8List.
Breaking changes:
-
Replaced
<FixedInt>.bitswith<FixedInt>.toBitList():- final bits = Int8(0).bits; + final bits = Int8(0).toBitList();
4.0.0-alpha
New features:
Lots and lots. It will be easier to just read the API documentation.
Breaking changes:
Basically everything. The entire API has been restructured to use extension
types, and some APIs removed entirely that were either not well-thought out
(oops) or were unnecessary:-
Integral, which was a base type for defining integers, has been removed in
favor of a helper class,IntDescriptor, which is used to define new integer
types, and acts sort of a meta type or poor man's macro for defining features:- class Int4 extends Integral<Int4> { - Int4(int value) : super.checked(value, signed: true, size: 4); - - @override - Int4 wrapSafeValue(int value) => Int4(value); - } + extension type const Int4._(int _) implements FixedInt { + static const _descriptor = _IntDescriptor<Int8>.signed( + Int4.fromUnchecked, + width: 4, + max: 7, + ); + + factory Int4(int v) => _descriptor.fit(v); + + // ... + }
In practice, it is much more difficult to implement a custom type, as many
methods have to be hand-written, but it is also a much better future-proof
approach. In the near-term, it's possible we could expose the code generator
used by this package internally as a tool for others to use, and longer-term
Dart macros can be used to simplify this
process for users. -
Fixed-size integers still exist, but with an updated API. Replacements are a
follows:.bitChunk(l, r)->.chunk(l, [s?]).bitRange(l, r)->.slice(l, [r?]).bitsSet->.countOnes().clearBit(n)->.setNthBit(n, false).getBit(n)->.nthBit(n)oroperator [n].replaceBitRange(l, r, b)->.replace(l, r?, b).rotateLeftShift(n)->.rotateLeft(n).rotateRightShift(n)->.rotateRight(n).setBit(n)->.setNthBit(n).signExtend(n)-> removed..sizehas been removed in favor of a static.width; as extension types
are non-virtual..toggleBit(n)->.toggleNthBit(n).value->.toInt()
-
The extension methods
BinaryIntwere removed. Instead, use the extension
types directly. A small subset of helper methods are available on
IntExtensionbut have little in common with the previous API (mostly
convenience methods). -
Every other extension method set was removed.
Full Changelog: v2.0.0...v4.0.0
Release notes
Open source →Stable release!
[!IMPORTANT] Version 4.0.0 has a large set of breaking changes, including removing the vast majority of extension methods and boxed classes, in favor of using the newer extension types feature in Dart. I would be opening to adding back some deprecated methods, or a
lib/compat.dartfile if there is demand; please file an issue if you need this.New features:
- Added
viewOrCopyAsBytes. - Added
BytesBuilderExtension.
Read the release notes below for a summary of changes.
- Added
-
4.0.0-beta14 Sep 2024 pre-release -
4.0.0-alpha02 Aug 2024 pre-releaseRelease notes
Open source →4.0.0-alpha
Important
Version 4.0.0 has a large set of breaking changes, including removing the
vast majority of extension methods and boxed classes, in favor of using the
newer extension types feature in Dart. I would be opening to adding back
some deprecated methods, or alib/compat.dartfile if there is demand;
please file an issue if you need this.New features:
Lots and lots. It will be easier to just read the API documentation.
Breaking changes:
Basically everything. The entire API has been restructured to use extension
types, and some APIs removed entirely that were either not well-thought out
(oops) or were unnecessary:-
Integral, which was a base type for defining integers, has been removed in
favor of a helper class,IntDescriptor, which is used to define new integer
types, and acts sort of a meta type or poor man's macro for defining features:- class Int4 extends Integral<Int4> { - Int4(int value) : super.checked(value, signed: true, size: 4); - - @override - Int4 wrapSafeValue(int value) => Int4(value); - } + extension type const Int4._(int _) implements FixedInt { + static const _descriptor = _IntDescriptor<Int8>.signed( + Int4.fromUnchecked, + width: 4, + max: 7, + ); + + factory Int4(int v) => _descriptor.fit(v); + + // ... + }
In practice, it is much more difficult to implement a custom type, as many
methods have to be hand-written, but it is also a much better future-proof
approach. In the near-term, it's possible we could expose the code generator
used by this package internally as a tool for others to use, and longer-term
Dart macros can be used to simplify this
process for users. -
Fixed-size integers still exist, but with an updated API. Replacements are a
follows:.bitChunk(l, r)->.chunk(l, [s?]).bitRange(l, r)->.slice(l, [r?]).bitsSet->.countOnes().clearBit(n)->.setNthBit(n, false).getBit(n)->.nthBit(n)oroperator [n].replaceBitRange(l, r, b)->.replace(l, r?, b).rotateLeftShift(n)->.rotateLeft(n).rotateRightShift(n)->.rotateRight(n).setBit(n)->.setNthBit(n).signExtend(n)-> removed..sizehas been removed in favor of a static.width; as extension types
are non-virtual..toggleBit(n)->.toggleNthBit(n).value->.toInt()
-
The extension methods
BinaryIntwere removed. Instead, use the extension
types directly. A small subset of helper methods are available on
IntExtensionbut have little in common with the previous API (mostly
convenience methods). -
Every other extension method set was removed.
Release notes
Open source →New features:
Lots and lots. It will be easier to just read the API documentation.
Breaking changes:
Basically everything. The entire API has been restructured to use extension types, and some APIs removed entirely that were either not well-thought out (oops) or were unnecessary:
-
Integral, which was a base type for defining integers, has been removed in favor of a helper class,IntDescriptor, which is used to define new integer types, and acts sort of a meta type or poor man's macro for defining features:- class Int4 extends Integral<Int4> { - Int4(int value) : super.checked(value, signed: true, size: 4); - - @override - Int4 wrapSafeValue(int value) => Int4(value); - } + extension type const Int4._(int _) implements FixedInt { + static const _descriptor = _IntDescriptor<Int8>.signed( + Int4.fromUnchecked, + width: 4, + max: 7, + ); + + factory Int4(int v) => _descriptor.fit(v); + + // ... + }In practice, it is much more difficult to implement a custom type, as many methods have to be hand-written, but it is also a much better future-proof approach. In the near-term, it's possible we could expose the code generator used by this package internally as a tool for others to use, and longer-term Dart macros can be used to simplify this process for users.
-
Fixed-size integers still exist, but with an updated API. Replacements are a follows:
.bitChunk(l, r)->.chunk(l, [s?]).bitRange(l, r)->.slice(l, [r?]).bitsSet->.countOnes().clearBit(n)->.setNthBit(n, false).getBit(n)->.nthBit(n)oroperator [n].replaceBitRange(l, r, b)->.replace(l, r?, b).rotateLeftShift(n)->.rotateLeft(n).rotateRightShift(n)->.rotateRight(n).setBit(n)->.setNthBit(n).signExtend(n)-> removed..sizehas been removed in favor of a static.width; as extension types are non-virtual..toggleBit(n)->.toggleNthBit(n).value->.toInt()
-
The extension methods
BinaryIntwere removed. Instead, use the extension types directly. A small subset of helper methods are available onIntExtensionbut have little in common with the previous API (mostly convenience methods). -
Every other extension method set was removed.
-
-
4.0.0-alpha+103 Aug 2024 pre-releaseRelease notes
Open source →4.0.0-alpha+1
New features:
-
Added
BitList, a compactList<bool>implementation that stores every
element as a single bit, with implementations that are fixed-size and
growable. -
Added
<FixedInt>.zeroand<FixedInt>.oneas static constants. -
Added
collectBytes(), a utility to convert aStream<List<int>>into a
Uint8List.
Breaking changes:
-
Replaced
<FixedInt>.bitswith<FixedInt>.toBitList():- final bits = Int8(0).bits; + final bits = Int8(0).toBitList();
Release notes
Open source →New features:
-
Added
BitList, a compactList<bool>implementation that stores every element as a single bit, with implementations that are fixed-size and growable. -
Added
<FixedInt>.zeroand<FixedInt>.oneas static constants. -
Added
collectBytes(), a utility to convert aStream<List<int>>into aUint8List.
Breaking changes:
-
Replaced
<FixedInt>.bitswith<FixedInt>.toBitList():- final bits = Int8(0).bits; + final bits = Int8(0).toBitList();
-
-
4.0.0-alpha+203 Aug 2024 pre-releaseRelease notes
Open source →4.0.0-alpha+2
Breaking changes:
<FixedInt>, which was pointless, is now justint. That means that any
fixed integer representation can be provided somewhere anintis expected,
which cuts down on boilerplate without much value.
Release notes
Open source →Breaking changes:
<FixedInt>, which was pointless, is now justint. That means that any fixed integer representation can be provided somewhere anintis expected, which cuts down on boilerplate without much value.
-
4.0.0-alpha+303 Aug 2024 pre-releaseRelease notes
Open source →4.0.0-alpha+3
New features:
- Added
<Int>.maxIntand<Int>.minIntas static (int) constants.
Release notes
Open source →New features:
- Added
<Int>.maxIntand<Int>.minIntas static (int) constants.
- Added
-
4.0.0-alpha+403 Aug 2024 pre-release -
4.0.0-alpha+503 Aug 2024 pre-releaseRelease notes
Open source →4.0.0-alpha+5
<Int>.checkRangereturns theintif no error was thrown (instead of
void).
Release notes
Open source →<Int>.checkRangereturns theintif no error was thrown (instead ofvoid).
-
4.0.0-alpha+603 Aug 2024 pre-releaseRelease notes
Open source →4.0.0-alpha+6
- Just kidding,
checkRangewill return{{Int}}if no error is thrown.
- Just kidding,
-
4.0.0-alpha+703 Aug 2024 pre-releaseRelease notes
Open source →4.0.0-alpha+7
- Added
<Int>.lsb. - Removed bit-operations from
IntExtension; they are too easy to use
incorrectly in the JS VM.
Release notes
Open source →- Added
<Int>.lsb. - Removed bit-operations from
IntExtension; they are too easy to use incorrectly in the JS VM.
- Added
-
3.0.127 Jun 2022 -
3.0.012 Jun 2022Release notes
Open source →Wooho: 🎉 Added support for Dart SDK 2.17.0 and Null Safety 🎉
Changes are relatively minor, some code that threw an
ArgumentErroron a null value now fails statically, but otherwise there are no behavioral changes to well-behaving code.Special thanks to https://github.com/leynier for driving this update!
-
2.0.027 Jul 2020Release notes
Open source →Highlights:
Added limited support for operations on integer values that exceed 32-bits. Before
2.0.0most of the methods provided by this package had undefined behavior when accessing a bit > the 31st bit when compiled to JavaScript:msbgetBitsetBitandisSetclearBitandisClearedtoggleBitcountSetBitsbitRangeandbitChunkhiLotoBinaryandtoBinaryPadded
In addition, these operations will now throw
UnsupportedErrorwhen compiled to JavaScript when attempting operations on integer values that exceed 52-bits, which is the maximum integer that is supported in JavaScript VMs. The remaining methods (i.e.signedRightShift, so on), unless otherwise documented are assumed to have undefined behavior when compiled to JavaScript.Tip: Don't want to consider all of that? You can always just use
Uint32!Operating on Larger Ints:
Added
<int>.hiLo(), which returns a fixed 2-lengthUint32Listwhere element 0 is the "hi" (upper bits) and element 1 is the "lo" (lower bits). Because of platform limitations, "hi" may only include up to the 52nd bit.Additionally,
Uint32Listhas received new extension methods through the extension classBinaryUint64HiLo(e.g. the result of<int>.hiLo()), which simplifies operations for integers larger than 32 bits:.hiand.logetters.~and&and|operators.equals(Uint32List)andtoInt()methods.
These methods allow treating a
Uint32Listroughly as a 64-bit integer with limited boxing. We may still consider adding aUint64boxedIntegralin a future release, but you may also try using these other implemntations:Additional Changes:
- Added
<int>.pow(n), which is like<dart:math>.powwith a return ofint. - Added
<Integral>.signExtend(startSize). - Removed all methods deprecated up to this point.
- Removed
<Integral>.[un]signed, which was misleading for unsigned integers. - Fixed a bug where
<int>.replaceBitRangeoften emitted an incorrect result. - Fixed a bug where
<int>.signExtendoften emitted an incorrect result.
-
1.7.012 Jul 2020Release notes
Open source →- Deprecated
<*>.shiftRightin favor of<*>.signedShiftRight>. - Deprecated
<*>.rotateRight, which was not correctly implemeted. - Added
<*>.rotateRightShiftto replacerotateRight. - Updated some doc comments that referred to incorrect JavaScript operators.
- Deprecated
-
1.6.011 Jul 2020Release notes
Open source →- Added
<BinaryInt|BinaryList|Integral>.toggleBit. - Deprecated
Integral.setBitsin favor of.bitsSet.
- Added
-
1.5.007 Jul 2020Release notes
Open source →- Added
BitPatternGroup's constructor, deprecating.toGroup(). - Added
BitPart.zeroandBitPart.oneand deprecatedBitPart(int).
- Added
-
1.4.006 Jul 2020Release notes
Open source →- Added
List<int>.toBits()as a replacement forList<int>.parseBits(). - Added
String.bitsas a replacement forString.parseBits(). - Deprecated
List<int>.parseBits()andString.parseBits(). - Deprecated
int.as[U]Int{N}functions in favor of manual wrapping.
- Added
-
1.3.002 Jul 2020Release notes
Open source →- Added comparison operators (
>,>=,<,<=) toIntegral. - Added
<Integral>.checkRangeand<Integral>.assertRangestatic methods. - Added the abiltiy to extend
Integralto create custom-sized integers.
- Added comparison operators (
-
1.2.221 Jun 2020Release notes
Open source →- Fixed a bug where
_InterpretedBitPattern(theBitPatterngenerated fromBitPatternBuilder) was sorted in an incorrect order (ascending instead of descending), which would notmatchcorrectly in some scenarios.
- Fixed a bug where
-
1.2.121 Jun 2020Release notes
Open source →- Fixed a bug where
BitPatternBuilder.parse('00AA_AABB')incorrectly threw aFormatExceptionassuming that_deliniated the end of theAvariable segment and the subsequentAwas a new segment (which is invalid). It now correctly parses the above as just two variable segments (AAAA,BB).
- Fixed a bug where
-
1.2.021 Jun 2020Release notes
Open source →-
Added
BitPatternBuilder.parse, a simplified-format for buildingBitPatternfrom a string of alpha-numeric characters, where0and1are pre-defined (static) flags for matching, and charaters are variable segments:// Create a BitPattern (Data Structures). final $01V = BitPatternBuilder([ BitPart(0), BitPart(1), BitPart.v(1, 'A'), ]).build(); // Create a BitPattern (Parse a String). final $01Vs = BitPatternBuilder.parse('01A').build(); print($01V == $01Vs); // true -
Fixed a bug where it was not possible to capture variables that were >8-bit.
-
-
1.1.021 Jun 2020Release notes
Open source →- Added
BitPatternBuilder,BitPattern,BitPart: a new API in order to build bit-based patterns and match against arbitrary sets of bits, optionally extracting variable names. This API is intended to make it easier to build apps and packages around implementing emulators and other decoders.
- Added
-
1.0.020 Jun 2020Release notes
Open source →A large update to bring into line for Dart 2, as well take advantage of newer langauge features like extension methods over top-level methods. As a result, the new API is not compatible with previous versions, but migration should be trivial.
-
0.1.315 May 2017 -
0.1.219 Mar 2017Release notes
Open source →- Moved into a standalone repository (outside of
gba.dart). - Added
signExtendas a method toIntegral. - Added
areSet. - Added
msb.
- Moved into a standalone repository (outside of
-
0.1.118 Mar 2017 -
0.1.019 Feb 2017 -
0.0.411 Feb 2017 -
0.0.309 Feb 2017 -
0.0.209 Feb 2017Release notes
Open source →- Added
isNegative,hasCarryBit,doesAddOverflow,doesSubOverflow,mask. - Added
parseBits.
- Added
-
0.0.108 Feb 2017Release notes
Open source →- Add top-level
isSetandisClear,Integral#isSet,Integral#isClear. - Add checked-mode range checks to
bitChunkandbitRange. - Fix a bug in the implementation of
bitChunkandbitRange. - Added a top-level
fromBitsandIntegral#fromBits
- Add top-level
-
0.0.007 Feb 2017