function y = base64decode(x) %BASE64DECODE Perform base64 decoding on a string. % % BASE64DECODE(STR) decodes the given base64 string STR. % % Any character not part of the 65-character base64 subset set is silently % ignored. % % This function is used to decode strings from the Base64 encoding specified % in RFC 2045 - MIME (Multipurpose Internet Mail Extensions). The Base64 % encoding is designed to represent arbitrary sequences of octets in a form % that need not be humanly readable. A 65-character subset ([A-Za-z0-9+/=]) % of US-ASCII is used, enabling 6 bits to be represented per printable % character. % % See also BASE64ENCODE. % Author: Peter J. Acklam % Time-stamp: 2004-09-20 08:20:50 +0200 % E-mail: pjacklam@online.no % URL: http://home.online.no/~pjacklam % Modified by Guillaume Flandin, May 2008 % Perform the following mapping %-------------------------------------------------------------------------- % A-Z -> 0 - 25 a-z -> 26 - 51 0-9 -> 52 - 61 % + -> 62 / -> 63 = -> 64 % anything else -> NaN base64chars = NaN(1,256); base64chars('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=') = 0:64; x = base64chars(x); % Remove/ignore any characters not in the base64 characters list or '=' %-------------------------------------------------------------------------- x = x(~isnan(x)); % Replace any incoming padding ('=' -> 64) with a zero pad %-------------------------------------------------------------------------- if x(end-1) == 64, p = 2; x(end-1:end) = 0; elseif x(end) == 64, p = 1; x(end) = 0; else p = 0; end % Allocate decoded data array %-------------------------------------------------------------------------- n = length(x) / 4; % number of groups x = reshape(uint8(x), 4, n); % input data y = zeros(3, n, 'uint8'); % decoded data % Rearrange every 4 bytes into 3 bytes %-------------------------------------------------------------------------- % 00aaaaaa 00bbbbbb 00cccccc 00dddddd % % to form % % aaaaaabb bbbbcccc ccdddddd y(1,:) = bitshift(x(1,:), 2); % 6 highest bits of y(1,:) y(1,:) = bitor(y(1,:), bitshift(x(2,:), -4)); % 2 lowest bits of y(1,:) y(2,:) = bitshift(x(2,:), 4); % 4 highest bits of y(2,:) y(2,:) = bitor(y(2,:), bitshift(x(3,:), -2)); % 4 lowest bits of y(2,:) y(3,:) = bitshift(x(3,:), 6); % 2 highest bits of y(3,:) y(3,:) = bitor(y(3,:), x(4,:)); % 6 lowest bits of y(3,:) % Remove any zero pad that was added to make this a multiple of 24 bits %-------------------------------------------------------------------------- if p, y(end-p+1:end) = []; end % Reshape to a row vector %-------------------------------------------------------------------------- y = reshape(y, 1, []);