@@ -2245,24 +2245,25 @@ String String::createStringFromData (const void* const unknownData, int size)
22452245 if (size == 1 )
22462246 return charToString ((yup_wchar) data[0 ]);
22472247
2248- if (CharPointer_UTF16::isByteOrderMarkBigEndian (data)
2249- || CharPointer_UTF16::isByteOrderMarkLittleEndian (data))
2250- {
2251- const int numChars = size / 2 - 1 ;
2248+ const auto bigEndianData = CharPointer_UTF16::isByteOrderMarkBigEndian (data);
22522249
2253- StringCreationHelper builder ((size_t ) numChars);
2250+ if (bigEndianData || CharPointer_UTF16::isByteOrderMarkLittleEndian (data))
2251+ {
2252+ const auto numUnits = size / 2 - 1 ;
2253+ const auto src = unalignedPointerCast<const uint16*> (data + 2 );
2254+ const auto swapBytes = bigEndianData ? ByteOrder::swapIfLittleEndian<uint16>
2255+ : ByteOrder::swapIfBigEndian<uint16>;
22542256
2255- auto src = unalignedPointerCast< const uint16*> (data + 2 );
2257+ StringCreationHelper builder (( size_t ) numUnits );
22562258
2257- if ( CharPointer_UTF16::isByteOrderMarkBigEndian (data) )
2259+ for ( int i = 0 ; i < numUnits; )
22582260 {
2259- for (int i = 0 ; i < numChars; ++i)
2260- builder.write ((yup_wchar) ByteOrder::swapIfLittleEndian (src[i]));
2261- }
2262- else
2263- {
2264- for (int i = 0 ; i < numChars; ++i)
2265- builder.write ((yup_wchar) ByteOrder::swapIfBigEndian (src[i]));
2261+ const uint16 wideBuffer[] { swapBytes (src[i]),
2262+ swapBytes ((i + 1 == numUnits) ? (uint16) 0 : src[i + 1 ]) };
2263+ const CharPointer_UTF16 ptr { reinterpret_cast <const CharPointer_UTF16::CharType*> (wideBuffer) };
2264+
2265+ builder.write (*ptr);
2266+ i += (int ) ((ptr + 1 ).getAddress () - ptr.getAddress ());
22662267 }
22672268
22682269 builder.write (0 );
@@ -2745,3 +2746,4 @@ String String::dedentLines() const
27452746}
27462747
27472748} // namespace yup
2749+
0 commit comments