Base24编码以及解码的实现

unit Base24Unt;

{Base24 算法}

interface

uses Windows,Sysutils,Dialogs;

const
  EncodeTable: array[0..23] of Char ='BCDFGHJKMPQRTVWXY2346789' ;

  DecodeTable: array[#0..#127] of Byte = (
    25,25,25,25,25,25,25,25,
    25,25,25,25,25,25,25,25,
    25,25,25,25,25,25,25,25,
    25,25,25,25,25,25,25,25,
    25,25,25,25,25,25,25,25,
    25,25,25,25,25,25,25,25,
    25,25,17,18,19,25,20,21,
    22,23,25,25,25,25,25,25,
    25,25, 0, 1, 2,25, 3, 4,
     5,25, 6, 7,25, 8,25,25,
     9,10,11,25,12,25,13,14,
    15,16,25,25,25,25,25,25,
    25,25,25,25,25,25,25,25,
    25,25,25,25,25,25,25,25,
    25,25,25,25,25,25,25,25,
    25,25,25,25,25,25,25,25);

function ByteToBase24(buf:array of byte):String;
procedure Base24ToByte(sValue:String;var buf:array of byte);
function GetValIndex(tmpchar:String):Integer;


implementation

function GetValIndex(tmpchar:String):Integer;
var
  i:Integer;
begin
  for i:=0 to 24 do
  begin
    if tmpchar=EncodeTable[i] then
    begin
      result:=i;
      break;
    end;
  end;
end;

function ByteToBase24(buf:array of byte):String;
var
  i,j:Integer;
  K:Longword;
begin
  for i := 24 downto 0 do
  begin
  K := 0;
  for j := High(buf) downto Low(buf) do
    begin
    K := (K shl 8) + buf[j];
    buf[j] := K div 24;
    K := K mod 24;
    end;
  Result :=ConCat(EncodeTable[K],Result);
  If (i Mod 5 = 0) And (i <> 0) Then
     Result := ConCat('-' , Result);
  end;
end;

procedure Base24ToByte(sValue:String;var buf:array of byte);
var
  i,j,m:Integer;
  K:Longword;
  tmpchar:string;
  TmpBuffer:array[0..24] of Byte;
begin
  sValue:=StringReplace(sValue,'-','',[rfReplaceAll, rfIgnoreCase]);
  k:=0;
  for i:=0 to 24 do
  begin
   tmpchar:=copy(sValue,i+1,1);
   m:=GetValIndex(tmpchar);
   k:=m;
   for j:=0 to 14 do
   begin
     k:=(buf[j]*24+k);
     buf[j]:=K mod 256;
     K:=K div 256;
   end;
  end;
end;


end.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的Base64编码解码实现的C程序: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> const char BASE64_TABLE[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; char* base64_encode(const unsigned char* data, size_t input_length) { size_t output_length = 4 * ((input_length + 2) / 3); char* encoded_data = malloc(output_length + 1); if (encoded_data == NULL) return NULL; for (size_t i = 0, j = 0; i < input_length;) { uint32_t octet_a = i < input_length ? data[i++] : 0; uint32_t octet_b = i < input_length ? data[i++] : 0; uint32_t octet_c = i < input_length ? data[i++] : 0; uint32_t triple = (octet_a << 0x10) + (octet_b << 0x08) + octet_c; encoded_data[j++] = BASE64_TABLE[(triple >> 3 * 6) & 0x3F]; encoded_data[j++] = BASE64_TABLE[(triple >> 2 * 6) & 0x3F]; encoded_data[j++] = BASE64_TABLE[(triple >> 1 * 6) & 0x3F]; encoded_data[j++] = BASE64_TABLE[(triple >> 0 * 6) & 0x3F]; } for (size_t i = 0; i < input_length % 3; i++) { encoded_data[output_length - 1 - i] = '='; } encoded_data[output_length] = '\0'; return encoded_data; } unsigned char* base64_decode(const char* data, size_t input_length, size_t* output_length) { if (input_length % 4 != 0) return NULL; *output_length = input_length / 4 * 3; if (data[input_length - 1] == '=') (*output_length)--; if (data[input_length - 2] == '=') (*output_length)--; unsigned char* decoded_data = malloc(*output_length); if (decoded_data == NULL) return NULL; for (size_t i = 0, j = 0; i < input_length;) { uint32_t sextet_a = data[i] == '=' ? 0 & i++ : BASE64_TABLE[data[i++]]; uint32_t sextet_b = data[i] == '=' ? 0 & i++ : BASE64_TABLE[data[i++]]; uint32_t sextet_c = data[i] == '=' ? 0 & i++ : BASE64_TABLE[data[i++]]; uint32_t sextet_d = data[i] == '=' ? 0 & i++ : BASE64_TABLE[data[i++]]; uint32_t triple = (sextet_a << 3 * 6) + (sextet_b << 2 * 6) + (sextet_c << 1 * 6) + (sextet_d << 0 * 6); if (j < *output_length) decoded_data[j++] = (triple >> 2 * 8) & 0xFF; if (j < *output_length) decoded_data[j++] = (triple >> 1 * 8) & 0xFF; if (j < *output_length) decoded_data[j++] = (triple >> 0 * 8) & 0xFF; } return decoded_data; } int main() { const char* input = "Hello, world!"; size_t input_length = strlen(input); char* encoded_data = base64_encode((const unsigned char*)input, input_length); printf("Encoded data: %s\n", encoded_data); size_t output_length; unsigned char* decoded_data = base64_decode(encoded_data, strlen(encoded_data), &output_length); printf("Decoded data: %s\n", decoded_data); free(encoded_data); free(decoded_data); return 0; } ``` 程序首先定义了一个Base64字符表,包含了所有可能的Base64字符。然后实现了两个函数,分别是Base64编码解码函数。 Base64编码函数将输入数据按照每3个字节一组进行处理,将每组字节转换成4个Base64字符。如果输入数据不是3的倍数,则在末尾加上相应数量的0字节,以使其能够被3整除。最后,函数将转换后的字符串末尾补上相应数量的=字符。 Base64解码函数将输入数据按照每4个字符一组进行处理,将每组字符转换成3个字节。如果末尾有=字符,则说明输入数据被填充了,需要在解码后去掉填充的0字节。 在程序中,我们将一个字符串进行Base64编码,然后再将编码后的字符串解码回原始字符串,最后输出结果。在输出解码后的数据时,我们将其当作一个字符串输出,可能会出现乱码,这是因为转换后的数据可能包含了0字节,而字符串输出函数会在遇到0字节时停止输出。如果需要输出二进制数据,应该使用fwrite函数来输出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骑着骆驼写程序

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值