在c#中编码Base64字符串块

本文关键字:字符串 Base64 编码 | 更新日期: 2023-09-27 18:17:50

我有一些文件,我把它保存在隔离的存储中,我如何使用块将隔离的流转换为Base64,如果我直接将流转换为Base64,那么Base64就会变得太长,visual studio停止工作。那么如何使用块呢?请看下面的代码:

BinaryReader rdr = new BinaryReader(isofile);
long lng = rdr.BaseStream.Length;
int rr = Convert.ToInt32(lng);
byte[] b = rdr.ReadBytes(rr);
string str = Convert.ToBase64String(b);

在c#中编码Base64字符串块

尝试使用预定义的块大小并按数据块读取文件。然后,您可以使用每个块中的数据并使用它。如果您需要将整个文件作为Base64发布,那么按块读取它不会改变它太长这一事实,如果这是问题所在的话。

int chunkSize = 1024;
string source = @"file.accdb";
BinaryReader rdr = new BinaryReader(new FileStream(source, FileMode.Open));
int streamLength = (int)rdr.BaseStream.Length;

while (rdr.BaseStream.Position < rdr.BaseStream.Length) 
{
    byte[] b = new byte[chunkSize];
    long remaining = rdr.BaseStream.Length - rdr.BaseStream.Position;
    if(remaining >= chunkSize)
    {
        rdr.Read(b, 0, chunkSize);
    }
    else
    {
        rdr.Read(b, 0, (int)remaining);
    }
    string chunkString = Convert.ToBase64String(b);
    // .. do something with the chunk of data, write to a stream, etc
}

EDIT:我已经在您的场景中进行了测试,阅读您使用带有块的默认windows安装获得的野生动物视频,并将它们写入带有字节的文件,并且还使用Base64编码的字符串,就像您正在做的那样,两个测试都是可以的,我可以在两种情况下播放视频而没有问题,因此阅读方法不应该是这里的问题。我已经提供了我用于测试的方法。如果问题仍然存在,请尝试上传一个小文件,并验证发送的内容与web服务获取和保存的内容是否匹配。我认为问题可能是我在下面的评论中描述的,c#和Java对Base64的处理有点不同。

StringBuilder acc = new StringBuilder();
int chunkSize = 2187;
string source = @"Wildlife.wmv";
BinaryReader rdr = new BinaryReader(new FileStream(source, FileMode.Open));
while (rdr.BaseStream.Position < rdr.BaseStream.Length)
{
    byte[] b = new byte[chunkSize];
    long remaining = rdr.BaseStream.Length - rdr.BaseStream.Position;
    if (remaining >= chunkSize)
    {
        rdr.Read(b, 0, chunkSize);
    }
    else
    {
        rdr.Read(b, 0, (int)remaining);
    }
    acc.Append(Convert.ToBase64String(b));
}
FileStream fs = new FileStream(@"c:'dev'test.wmv", FileMode.OpenOrCreate);
fs.Write(Convert.FromBase64String(acc.ToString()),0,0);
Process.Start(@"c:'dev'test.wmv");

我仍然不是百分之百地知道为什么,但我建议看看这个答案,寻找类似的东西。

我正在使用web服务,我不记得在很长一段时间内需要使用base64。上次我做的是一个php程序,它与不同的应用程序通信…你确定要这么做吗?


示例(使用Andrej代码)。这种情况可以工作,但是:请阅读代码后面的警告以获取更多

// Input
var my_string = "Hello world!";
// Get as binary
System.Text.ASCIIEncoding  encoding = new System.Text.ASCIIEncoding();
var input_as_binary = encoding.GetBytes(my_string);
    /*
        72 
        101 
        108 
        108 
        111 
        32 
        119 
        111 
        114 
        108 
        100 
        33 
    */
// If the following is not an exact divisor, It won't work.
int chunkSize = 6;
// Create a stream and reader
Stream stream = new MemoryStream(as_binary);
BinaryReader rdr = new BinaryReader(stream);
int streamLength = (int)rdr.BaseStream.Length;
// A stub to hold the bits of Base64. This will happen on your receiving end
var sb = new StringBuilder();
// from Andrej answer, I'm just using the "streamLength" Var he defined 
while (rdr.BaseStream.Position < streamLength) 
{
    byte[] b = new byte[chunkSize];
    long remaining = streamLength - rdr.BaseStream.Position;
    if(remaining >= chunkSize)
    {
        rdr.Read(b, 0, chunkSize);
    }
    else
    {
        rdr.Read(b, 0, (int)remaining);
    }
    string chunkString = Convert.ToBase64String(b).Dump("as base 64");
    // Lets assume we send it and it's received on the other side
    sb.Append(chunkString);
}
// This should happen on your receiving side as well
var other_side = sb.ToString(); // value => SGVsbG8gd29ybGQh
// Back into byte array
var byte_from_64 = Convert.FromBase64String(other_side);
// Back into string. Will hold "Hello World!"
var string_from_byte = encoding.GetString(byte_from_64);

以上工作。但是如果你将块大小更改为不能给你精确的Base64位(例如5,而不是6),你将得到一个像SGVsbG8=IHdvcmw=ZCEAAAA=这样的字符串,然后出现一个异常:

FormatException
The input is not a valid Base-64 string as it contains a non-base 64 character 
, more than two padding characters, or an illegal character among the pa... 

这就是为什么我建议玩你的输入:)

我会选择https://learn.microsoft.com/en-us/dotnet/api/system.security.cryptography.tobase64transform?view=netcore-3.1

我可以这样实现https://gist.github.com/sebnilsson/e12a96cd07e5b044eea7bc8b7477b20d