VB2015でのuudecodeについて への返答
投稿で使用できる特殊コードの説明。(別タブで開きます。)
以下の返答は逆順(新しい順)に並んでいます。
投稿者 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で提供されています。
・仕様を元にデコーダーを自分で考えて書く
・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 11:58:47
System.Convert.FromBase64String メソッドの解説には
「使用例」として uuencode された文字列のデコード処理が
掲載されているようですが、それを利用できないでしょうか。
「使用例」として uuencode された文字列のデコード処理が
掲載されているようですが、それを利用できないでしょうか。
投稿者 ココココ  (社会人)
投稿日時
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);
}
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);
}
>>魔界の仮面弁士 様
unencodeされたファイルを読み込み、System.Convert.FromBase64Stringを利用してみましたが、
以下のエラーとなります。
s の形式が正しくありません。 s に Base-64 以外の文字が含まれるか、3 個以上の埋め込み文字があるか、または埋め込み文字の間に空白以外の文字が含まれています。
>>YuO 様
情報ありがとうございます。
ライブラリの使用はNGとなっておりますので、コードを書き直すしかないですね。。。
C++のソースをVBに変換する方法があれば非常に助かるのですが。。。