private static StringBuilder EncodeWorker(string data, char empty, EncodeChar encFunc) { StringBuilder res = new StringBuilder(); int bits; for (int i = 0; i < data.Length; i += 3) { switch (data.Length - i) { case 1: // only one char, emit 2 bytes & // padding bits = (data[i] & 0xff) << 16; res.Append(encFunc((bits >> 18) & 0x3f)); res.Append(encFunc((bits >> 12) & 0x3f)); res.Append(empty); res.Append(empty); break; case 2: // only two chars, emit 3 bytes & // padding bits = ((data[i] & 0xff) << 16) | ((data[i + 1] & 0xff) << 8); res.Append(encFunc((bits >> 18) & 0x3f)); res.Append(encFunc((bits >> 12) & 0x3f)); res.Append(encFunc((bits >> 6) & 0x3f)); res.Append(empty); break; default: // got all 3 bytes, just emit it. bits = ((data[i] & 0xff) << 16) | ((data[i + 1] & 0xff) << 8) | ((data[i + 2] & 0xff)); res.Append(encFunc((bits >> 18) & 0x3f)); res.Append(encFunc((bits >> 12) & 0x3f)); res.Append(encFunc((bits >> 6) & 0x3f)); res.Append(encFunc(bits & 0x3f)); break; } } return(res); }
private static StringBuilder EncodeWorker(string data, int lineBreak, char empty, EncodeChar encFunc) { StringBuilder res = new StringBuilder(); int bits; int lineCount = 0; for (int i = 0; i < data.Length; i += 3) { switch (data.Length - i) { case 1: // only one char, emit 2 bytes & // padding bits = (data[i] & 0xff) << 16; res.Append(encFunc((bits >> 18) & 0x3f)); res.Append(encFunc((bits >> 12) & 0x3f)); res.Append(empty); res.Append(empty); break; case 2: // only two chars, emit 3 bytes & // padding bits = ((data[i] & 0xff) << 16) | ((data[i + 1] & 0xff) << 8); res.Append(encFunc((bits >> 18) & 0x3f)); res.Append(encFunc((bits >> 12) & 0x3f)); res.Append(encFunc((bits >> 6) & 0x3f)); res.Append(empty); break; default: // got all 3 bytes, just emit it. bits = ((data[i] & 0xff) << 16) | ((data[i + 1] & 0xff) << 8) | ((data[i + 2] & 0xff)); res.Append(encFunc((bits >> 18) & 0x3f)); res.Append(encFunc((bits >> 12) & 0x3f)); res.Append(encFunc((bits >> 6) & 0x3f)); res.Append(encFunc(bits & 0x3f)); break; } if (((res.Length - (lineCount)) % lineBreak) == 0) { res.Append('\n'); lineCount++; } } return res; }