Earlier in the year when Span
Part of the article was about how to convert between different
T's in the spans and it didn't go into too much detail about the how so I wrote an post which shows my investigation and examples.
I was recently contacted on twitter to say that the article helped the developer who sent me a message. It was nice to hear that my post helped them but it also highlighted that the API for
Span has changed since the early work so I wanted to update my example from before and identify the changes.
Originally the converting from
Span<int> was performed through using an extension method called NonPortableCast.
Span<int> asInts = asBytes.NonPortableCast<byte,int>();
This was not very clear or intuitive to find so I am glad this has been updated.
The action of converting is now performed by the
MemoryMarshal class through the
Span<int> asInts = MemoryMarshal.Cast<byte, int>(asBytes);
In addition to the converting functionality the ability to read the value from the
Span<T> to the
U directly has been updated via the
MemoryMarshal class as well.
int i = MemoryMarshal.Read<int>(asBytes);
Full example with the updates:
// set a plain integer and convert it to a byte array int number = 42; byte numberBytes = BitConverter.GetBytes(number); // now through the implicit casting convert to a span<byte> Span<byte> asBytes = numberBytes; // read the value from the bytes int i = MemoryMarshal.Read<int>(asBytes); // now using the MemoryMarshal interopservice Span<int> asInts = MemoryMarshal.Cast<byte, int>(asBytes); // check that it's all pointing to the same pointer references Assert.Equal(42, asInts); Assert.Equal(number, asInts); Assert.Equal(42, i); asInts = 123456; int converted = BitConverter.ToInt32(numberBytes, 0); Assert.Equal(123456, converted);
Hope this helps further people!
Any questions/comments then please contact me on Twitter @WestDiscGolf.
If it does help, please let me know!