Skip to content

[API Proposal] Expose missing BinaryPrimitives APIs #72107

Description

@tannergooding

System.Buffers.Binary.BinaryPrimitives exposes many APIs but there are few notable ones missing for core number types. We should extend the type to ensure that it supports the basic operations for all basic number types.

namespaceSystem.Buffers.Binary;publicstaticpartialclassBinaryPrimitives{// Read*BigEndian and Read*LittleEndianpublicstaticnintReadIntPtrBigEndian(ReadOnlySpan<byte>source);publicstaticnintReadIntPtrLittleEndian(ReadOnlySpan<byte>source);publicstaticInt128ReadInt128BigEndian(ReadOnlySpan<byte>source);publicstaticInt128ReadInt128LittleEndian(ReadOnlySpan<byte>source);publicstaticnuintReadUIntPtrBigEndian(ReadOnlySpan<byte>source);publicstaticnuintReadUIntPtrLittleEndian(ReadOnlySpan<byte>source);publicstaticUInt128ReadUInt128BigEndian(ReadOnlySpan<byte>source);publicstaticUInt128ReadUInt128LittleEndian(ReadOnlySpan<byte>source);// ReverseEndiannesspublicstaticnintReverseEndianness(nintvalue);publicstaticInt128ReverseEndianness(Int128value);publicstaticnuintReverseEndianness(nuintvalue);publicstaticUInt128ReverseEndianness(UInt128value);// TryRead*BigEndian and TryRead*LittleEndianpublicstaticboolTryReadIntPtrBigEndian(ReadOnlySpan<byte>source,outnintvalue);publicstaticboolTryReadIntPtrLittleEndian(ReadOnlySpan<byte>source,outnintvalue);publicstaticboolTryReadInt128BigEndian(ReadOnlySpan<byte>source,outInt128value);publicstaticboolTryReadInt128LittleEndian(ReadOnlySpan<byte>source,outInt128value);publicstaticboolTryReadUIntPtrBigEndian(ReadOnlySpan<byte>source,outnuintvalue);publicstaticboolTryReadUIntPtrLittleEndian(ReadOnlySpan<byte>source,outnuintvalue);publicstaticboolTryReadUInt128BigEndian(ReadOnlySpan<byte>source,outUInt128value);publicstaticboolTryReadUInt128LittleEndian(ReadOnlySpan<byte>source,outUInt128value);// TryWrite*BigEndian and TryWrite*LittleEndianpublicstaticboolTryWriteIntPtrBigEndian(ReadOnlySpan<byte>destination,nintvalue);publicstaticboolTryWriteIntPtrLittleEndian(ReadOnlySpan<byte>destination,nintvalue);publicstaticboolTryWriteInt128BigEndian(ReadOnlySpan<byte>destination,Int128value);publicstaticboolTryWriteInt128LittleEndian(ReadOnlySpan<byte>destination,Int128value);publicstaticboolTryWriteUIntPtrBigEndian(ReadOnlySpan<byte>destination,nuintvalue);publicstaticboolTryWriteUIntPtrLittleEndian(ReadOnlySpan<byte>destination,nuintvalue);publicstaticboolTryWriteUInt128BigEndian(ReadOnlySpan<byte>destination,UInt128value);publicstaticboolTryWriteUInt128LittleEndian(ReadOnlySpan<byte>destination,UInt128value);// Write*BigEndian and Write*LittleEndianpublicstaticvoidWriteIntPtrBigEndian(ReadOnlySpan<byte>destination,nintvalue);publicstaticvoidWriteIntPtrLittleEndian(ReadOnlySpan<byte>destination,nintvalue);publicstaticvoidWriteInt128BigEndian(ReadOnlySpan<byte>destination,Int128value);publicstaticvoidWriteInt128LittleEndian(ReadOnlySpan<byte>destination,Int128value);publicstaticvoidWriteUIntPtrBigEndian(ReadOnlySpan<byte>destination,nuintvalue);publicstaticvoidWriteUIntPtrLittleEndian(ReadOnlySpan<byte>destination,nuintvalue);publicstaticvoidWriteUInt128BigEndian(ReadOnlySpan<byte>destination,UInt128value);publicstaticvoidWriteUInt128LittleEndian(ReadOnlySpan<byte>destination,UInt128value);}

Additional Notes

Also missing are some APIs around char, Half, float, and double. However, there are concerns around char not being a "core" numeric type and around possible normalization issues for the various floating-point types, so they aren't included.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions