Casting int[] to ubyte[]: element wise cast or slice cast
H. S. Teoh
hsteoh at quickfur.ath.cx
Fri Feb 15 17:18:28 UTC 2019
On Fri, Feb 15, 2019 at 04:17:12PM +0000, Dennis via Digitalmars-d-learn wrote:
> I assumed that casting an int[] to a ubyte[] would keep all bytes and
> quadruple the length of the original array. But when the array is a
> literal, it keeps the same length but truncates every int element to a
> ubyte:
That's correct. If you want to *transcribe* a ubyte[] to an int[], what
you want is probably something like this:
import std.conv : to;
ubyte[] data = ...;
int[] result = data.map!(b => b.to!int).array;
[...]
> I looked at the spec and found this:
>
> https://dlang.org/spec/expression.html#cast_expressions
> "Casting a dynamic array to another dynamic array is done only if the
> array lengths multiplied by the element sizes match. The cast is done
> as a type paint, with the array length adjusted to match any change in
> element size. If there's not a match, a runtime error is generated."
>
> So is this a bug or am I missing something?
Read it again carefully: the casting is done "only if the array lengths
multiplied by the element sizes match". In other words:
T.sizeof * T[].length == U.sizeof * U[].length
Why? because that's the only case where you can reinterpret the
.sizeof*.length bytes as an array of a different type. There is no
conversion, the cast works as a reinterpretation. It's by design.
T
--
I'm still trying to find a pun for "punishment"...
More information about the Digitalmars-d-learn
mailing list