Visual Basic 中学校 掲示板 投稿内容
タグのない投稿を抽出 統計 RSS

Visual Basic 中学校 > 投稿一覧 >

VB2015でのuudecodeについて

タグの編集...

投稿者 ココココ   (社会人)   投稿日時 2017/4/14 11:16:14
LINUXでuuencodeされたファイルをVBにてデコードしたいです。
C言語では以下のソースでデコード可能ですが、VBではどのようにすれば可能でしょうか?
C言語は初心者のため、ご教授お願いします。

#include <stdio.h>
#include <string.h>
#define DEC(c)  (((c) - ' ') & 077)
static char outname[200];
int ReadDataLine(FILE *f,char *buf)
{
        int c,i;

        i=0;
        while ((c=fgetc(f)) != EOF) {
                if (c == '\n') break;
                if (c != '\r') {
                        buf[i++] = c;
                }
        }
        buf[i] = 0;
        return(c == EOF ? 0 : 1);
}

static char *uudecode (FILE *f)
{
  register int n;
  register char ch, *p;
  char buf[2 * BUFSIZ];
  FILE *out;

  do {
          if (!ReadDataLine(f,buf)) return(NULL);
  }
  while (strncmp(buf,"begin",5));
  p = buf + 6;


  while(*p && (strchr(" 01234567",*p))) p++;
  //while (*p && (*p == ' '|| *p == '0' || *p == '6')) p++; // Clem Dye, 13 July 2001.
  strcpy(outname,p);
  /* Create output file and set mode.  */ 
  out = fopen(outname,"wb");
  /* For each input line:  */
  while (1)
    {
        if (!ReadDataLine(f,buf)) break;
        if (!strncmp(buf,"end\r\n",5)) break;
          p = buf;

      /* N is used to avoid writing out all the characters at the end of the file.  */

      n = DEC (*p);
      if (n <= 0)
        break;
      for (++p; n > 0; p += 4, n -= 3)
        {
          if (n >= 3)
            {
              ch = DEC (p[0]) << 2 | DEC (p[1]) >> 4; 
              fputc(ch,out);
              ch = DEC (p[1]) << 4 | DEC (p[2]) >> 2; 
              fputc (ch,out);
              ch = DEC (p[2]) << 6 | DEC (p[3]);
              fputc (ch,out);
            }
          else
            {
              if (n >= 1)
                {
                  ch = DEC (p[0]) << 2 | DEC (p[1]) >> 4; 
                  fputc (ch,out);
                }
              if (n >= 2)
                {
                  ch = DEC (p[1]) << 4 | DEC (p[2]) >> 2; 
                  fputc (ch,out);
                }
            }
        }
    }

  fclose(out);
  return outname;
}

int main(int argc,char *argv[])
{
        FILE *f;

        if (argc <= 1) {
                printf("Usage: %s <input file>\n",argv[0]); 
                return(1);
        }
        f = fopen(argv[1],"rb");
        if (f == NULL) {
                printf("I can't find %s\n",argv[1]); 
                return(1);
        }
        uudecode(f);
        fclose(f);
        printf("Result decoded in %s\n",outname); 
        return(0);
}

投稿者 魔界の仮面弁士   (社会人)   投稿日時 2017/4/14 11:58:47
System.Convert.FromBase64String メソッドの解説には
「使用例」として uuencode された文字列のデコード処理が
掲載されているようですが、それを利用できないでしょうか。

投稿者 YuO   (社会人)   投稿日時 2017/4/14 13:54:55
デコーダーを自分で書きたいのであれば,
・仕様を元にデコーダーを自分で考えて書く
・CのコードをVBに合わせて書き直す
あたりだと思います。
# そのCのコードのライセンスに依存しますが。

ライブラリで良ければ,nugetでuuencodeを検索すると,
・DBTek Crypto Utils
http://www.nuget.org/packages/DBTek.Crypto/
・.NET Encryption Library 
http://www.nuget.org/packages/NetEncryptionLibrary/
などが引っかかりました。後者は有償のようですが,前者はMIT Licenseで提供されています。

投稿者 ココココ   (社会人)   投稿日時 2017/4/14 18:03:40
ご回答ありがとうございます。

>>魔界の仮面弁士 様
unencodeされたファイルを読み込み、System.Convert.FromBase64Stringを利用してみましたが、
以下のエラーとなります。

s の形式が正しくありません。 s に Base-64 以外の文字が含まれるか、3 個以上の埋め込み文字があるか、または埋め込み文字の間に空白以外の文字が含まれています。

>>YuO 様
情報ありがとうございます。
ライブラリの使用はNGとなっておりますので、コードを書き直すしかないですね。。。

C++のソースをVBに変換する方法があれば非常に助かるのですが。。。