Question

I want to populate part of a buffer with the bytes from a UTF-16 encoded string without allocating an intermediate byte array (i.e. without calling Encoding.Unicode.GetBytes(str))

Assuming that I know that a string contains only ASCII characters, is the following code safe?

        for (var i = 0; i < str.Length; i++)
        {
            var code = char.ConvertToUtf32(str, i);

            var high = (byte) (code & 0xFF);
            var low = (byte) ((code >> 8) & 0xFF);

            //k is the offset where we insert bytes of the UTF-16 encoded string

            buffer[i*2 + k] = high;
            buffer[i*2 + k + 1] = low;
        }
Was it helpful?

Solution

There is an overload of GetBytes that does what you want.

Encoding.Unicode.GetBytes(str, 0, str.Length, buffer, k);
// or, if you need to do something more complicated inside the `for` loop
for (var i = 0; i < str.Length; i++)
{
    Encoding.Unicode.GetBytes(str, i, 1, buffer, i*2 + k);
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top