| 686 | } |
| 687 | |
| 688 | void str_base64(char *dst, int dst_size, const void *data_raw, int data_size) |
| 689 | { |
| 690 | static const char DIGITS[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; |
| 691 | |
| 692 | const unsigned char *data = (const unsigned char *)data_raw; |
| 693 | unsigned value = 0; |
| 694 | int num_bits = 0; |
| 695 | int i = 0; |
| 696 | int o = 0; |
| 697 | |
| 698 | dst_size -= 1; |
| 699 | dst[dst_size] = 0; |
| 700 | while(true) |
| 701 | { |
| 702 | if(num_bits < 6 && i < data_size) |
| 703 | { |
| 704 | value = (value << 8) | data[i]; |
| 705 | num_bits += 8; |
| 706 | i += 1; |
| 707 | } |
| 708 | if(o == dst_size) |
| 709 | { |
| 710 | return; |
| 711 | } |
| 712 | if(num_bits > 0) |
| 713 | { |
| 714 | unsigned padded; |
| 715 | if(num_bits >= 6) |
| 716 | { |
| 717 | padded = (value >> (num_bits - 6)) & 0x3f; |
| 718 | } |
| 719 | else |
| 720 | { |
| 721 | padded = (value << (6 - num_bits)) & 0x3f; |
| 722 | } |
| 723 | dst[o] = DIGITS[padded]; |
| 724 | num_bits -= 6; |
| 725 | o += 1; |
| 726 | } |
| 727 | else if(o % 4 != 0) |
| 728 | { |
| 729 | dst[o] = '='; |
| 730 | o += 1; |
| 731 | } |
| 732 | else |
| 733 | { |
| 734 | dst[o] = 0; |
| 735 | return; |
| 736 | } |
| 737 | } |
| 738 | } |
| 739 | |
| 740 | static int base64_digit_value(char digit) |
| 741 | { |
no outgoing calls