cindyhfls's picture
Upload 155 files
0b58803 verified
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, []);