【发布时间】:2014-04-19 21:41:13
【问题描述】:
作为一名尝试进入 C# 的 Java 开发人员,我感到很困惑。我已经阅读了有关字符串类型的信息,它是不可变的,与 java 没有太大区别,只是它似乎不像那里的对象,但无论如何我都会有奇怪的行为。我在一个类上有以下 toString 方法
public override string ToString()
{
StringBuilder builder = new StringBuilder();
builder.Append("BlockType: ");
builder.Append(BlockType + "\n");
//builder.Append(System.Text.ASCIIEncoding.ASCII.GetChars(Convert.FromBase64String("dHh0AA==")));
//builder.Append("\n");
builder.Append("BlockName: ");
builder.Append(BlockName + "\n");
//builder.Append(System.Text.ASCIIEncoding.ASCII.GetChars(Convert.FromBase64String(this.BlockName)));
//builder.Append("\n");
builder.Append("BlockLength: " + this.BlockLength + "\n");
builder.Append("pBlockData: " + this.pBlockData + "\n");
return builder.ToString();
}
当我用数据填充它时。考虑到 BlockType 和 BlockName 将包含一个 Base64 字符串。我得到以下结果
FileVersionNo: 0
nx: 1024
ny: 512
TileSize: 256
HorizScale: 10
Precis: 0,01
ExtHeaderLength: 35
nExtHeaderBlocks: 1
pExtHeaderBlocks: System.Collections.Generic.LinkedList`1[LibFhz.HfzExtHeaderBlock]
BlockType: dHh0AA==
BlockName: YXBwLW5hbWUAAAAAAAAAAA==
BlockLength: 11
pBlockData: System.Byte[]
这正是我想要的完美,但是当我尝试获取那些 Base64(或 UTF-8,我都尝试过)的 ASCII 值时,我得到以下结果
FileVersionNo: 0
nx: 1024
ny: 512
TileSize: 256
HorizScale: 10
Precis: 0,01
ExtHeaderLength: 35
nExtHeaderBlocks: 1
pExtHeaderBlocks: System.Collections.Generic.LinkedList`1[LibFhz.HfzExtHeaderBlock]
BlockType: txt
代码似乎停止了,没有错误或堆栈跟踪。我不知道发生了什么。我首先认为缺少一个 \0 所以我已经将它添加到字符串中,然后我认为我需要一个 \r\n ...再次不是解决方案,我开始与只想知道如何做的人一起搜索Bas64 到 UTF-8 的转换......但这部分似乎很简单......这个代码停止不是。
任何关于 .net 中字符串处理的见解或链接都将不胜感激
【问题讨论】:
-
Convert.FromBase64String()可能会返回二进制零值,这些值将被转换为 ASCII NULL 字符。我想这可能会弄乱输出。你期待什么输出? -
base64 字符串通常没有有意义的 ASCII 值。如果是这样,那么一开始就没有理由对其进行编码,所以这看起来很奇怪。
-
BlockType: txt BlockName: app-name 是 Base64 内容的可读文本值,但您的二进制零值建议可能是罪魁祸首。小注意变量的内容被这个字符串填充了 blockName = Convert.ToBase64String(reader.ReadBytes(16));, 从流中读取的字节
标签: c# string utf-8 base64 ascii