解码PEM(c#)

时间:2010-07-28 12:42:48

标签: c# c encode

我已经选择了一些我需要使用的旧代码,并且我在C

中有以下功能
int pem64_decode_bytes(const char *intext,
                       int nchars,
                       unsigned char *outbytes)
{
  unsigned char *outbcopy = outbytes;
  while (nchars >= 4) {
    char 
      c1 = intext[0], 
      c2 = intext[1],
      c3 = intext[2],
      c4 = intext[3];
    int 
      b1 = pem64_dict_offset(c1), 
      b2 = pem64_dict_offset(c2),
      b3 = pem64_dict_offset(c3),
      b4 = pem64_dict_offset(c4);

    if ((b1 == -1) || (b2 == -1) || (b3 == -1) || (b4 == -1))
      return outbytes - outbcopy;

    *(outbytes++) = (b1 << 2) | (b2 >> 4);

    if (c3 != FILLERCHAR)
      *(outbytes++) = ((b2 & 0xf) << 4) | (b3 >> 2);
    if (c4 != FILLERCHAR)
      *(outbytes++) = ((b3 & 0x3) << 6) | b4;

    nchars -= 4;
    intext += 4;
  }

  return outbytes - outbcopy;
}

它应解码已编码的数据包。有谁知道这是否是标准功能?我需要将其转换为C#,我不是C编码器有没有人知道这样做的任何样本?

修改

=======

public static List<byte> pem64_decode_bytes(string InText, int NumberOfBytes)
    {
        var RetData = new List<byte>();

        while (NumberOfBytes >= 4)
        {
            char c1 = InText[0];
            char c2 = InText[1];
            char c3 = InText[2];
            char c4 = InText[3];

            int b1 = pem64_dict_offset(c1);
            int b2 = pem64_dict_offset(c2);
            int b3 = pem64_dict_offset(c3);
            int b4 = pem64_dict_offset(c4);

            if (b1 == -1 || b2 == -1 || b3 == -1 || b4 == -1)
            {
                return RetData;
            }

            (outbytes)++.Deref = b1 << 2 | b2 >> 4;
            if (c3 != FILLERCHAR)
            {
                (outbytes)++.Deref = (b2 & 0xf) << 4 | b3 >> 2;
            }
            if (c4 != FILLERCHAR)
            {
                (outbytes)++.Deref = (b3 & 0x3) << 6 | b4;
            }

            NumberOfBytes -= 4;
        }

        return RetData;
    }

1 个答案:

答案 0 :(得分:0)

你有pem64_dict_offset的来源吗?我不认为这是一个标准函数,虽然它看起来很像Base64解码。

如果是这样,转换为C#可能不会很困难。

*(outbytes ++)可能对非C程序员可怕的事情就是在字节块中附加一个字节。

C#类比将是:

List<Byte> outbytes = new List<Byte>()
outbytes.Add(the new byte)

'return outbytes-outbcopy'将成为'return outbytes.Count'(虽然在C#中更典型的是返回列表,而不是要求调用者为你分配它。