digitalmars.D.learn - string to char[4] FourCC conversion
- realhet (24/24) May 26 2023 Hello,
- Steven Schveighoffer (15/29) May 26 2023 This worked for me:
Hello,
Is there a way to do it nicer/better/faster/simpler?
```
char[4] fourC(string s)
{
uint res;//Zero initialized, not 0xff initialized.
auto cnt = min(s.length, 4),
p = cast(char[4]*)(&res);
(*p)[0..cnt] = s[0..cnt];
return *p;
}
```
I tried to use staticArray!(char, 4), on s.byChar, but failed.
I think I could do this using
cast(char[4])(s.take(4).enumerate.map!"cast(uint)(a.value)<<<(a.index*8)".sum),
but that seems no so effective. But at least that works in CT.
I hope there is a more clever way in the std library I couldn't
imagine at the moment...
```
//I also tried an arithmetic version, but it's impossible to
convert to char[4] except with using pointer casts...
uint fourCC(string s)
{ return s.take(4).enumerate.map!(a => a.value <<
cast(uint)a.index*8).sum; }
```
May 26 2023
On 5/26/23 8:19 AM, realhet wrote:
Hello,
Is there a way to do it nicer/better/faster/simpler?
```
char[4] fourC(string s)
{
uint res;//Zero initialized, not 0xff initialized.
auto cnt = min(s.length, 4),
p = cast(char[4]*)(&res);
(*p)[0..cnt] = s[0..cnt];
return *p;
}
```
This worked for me:
```d
char[4] fourC(string s)
{
if(s.length >= 4)
return s[0 .. 4];
char[4] res = 0;
res[0 .. s.length] = s;
return res;
}
```
Supporting returning as a 4-char array even when the input has less than
4 makes it tricky. But not so bad.
-Steve
May 26 2023
On Friday, 26 May 2023 at 13:18:15 UTC, Steven Schveighoffer
wrote:
This worked for me:
```d
char[4] fourC(string s)
{
if(s.length >= 4)
return s[0 .. 4];
char[4] res = 0;
res[0 .. s.length] = s;
return res;
}
```
Sometimes I forget that the return does an implicit cast. And it
looks inside the slice [..] if it constant or not. Lot of things
going on under the hood...
Thank You!
May 26 2023
On Friday, 26 May 2023 at 13:18:15 UTC, Steven Schveighoffer wrote:[...] This worked for me: ```d char[4] fourC(string s) { if(s.length >= 4) return s[0 .. 4];Silent truncation? Non-ASCII chars?char[4] res = 0;According to [1], [2] or [3] that should read ``` char[4] res = ' '; ```res[0 .. s.length] = s; return res; } ```[1] Multimedia Programming Interface and Data Specifications 1.0 IBM Corporation and Microsoft Corporation August 1991, p. 11 https://www-mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/Docs/riffmci.pdf [2] http://ffmpeg.org/doxygen/trunk/raw_8c_source.html#l00050 [3] https://en.wikipedia.org/wiki/FourCC "The byte sequence is usually restricted to ASCII printable characters, with space characters reserved for padding shorter sequences. [...] Some FourCCs however, do contain non-printable characters, and are not human-readable without special formatting for display; for example, 10bit Y'CbCr 4:2:2 video can have a FourCC of ('Y', '3', 10, 10) which ffmpeg displays as rawvideo (Y3[10] [10] / 0x0A0A3359), yuv422p10le."
May 27 2023









realhet <real_het hotmail.com> 