$dest = '';
$srcLen = ParagonIE_Sodium_Core_Util::
strlen($src);
// Main loop (no padding):
for ($i = 0;
$i + 3 <=
$srcLen;
$i += 3
) { /** @var array<int, int> $chunk */
$chunk =
unpack('C*', ParagonIE_Sodium_Core_Util::
substr($src,
$i, 3
));
$b0 =
$chunk[1
];
$b1 =
$chunk[2
];
$b2 =
$chunk[3
];
$dest .=
self::
encode6Bits( $b0 >> 2
) .
self::
encode6Bits((($b0 << 4
) |
($b1 >> 4
)) & 63
) .
self::
encode6Bits((($b1 << 2
) |
($b2 >> 6
)) & 63
) .
self::
encode6Bits( $b2 & 63
);
} // The last chunk, which may have padding:
if ($i <
$srcLen) { /** @var array<int, int> $chunk */
$chunk =
unpack('C*', ParagonIE_Sodium_Core_Util::
substr($src,
$i,
$srcLen -
$i));
$b0 =
$chunk[1
];
if ($i + 1 <
$srcLen) { $b1 =
$chunk[2
];