c#与Java的字符串混淆

本文关键字:字符串 Java | 更新日期: 2023-09-27 17:50:13

我很困惑,作为一个java开发人员试图进入c#。我读过关于字符串类型,它是不可变的,和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的ASCII值(或UTF-8,我都尝试过),我得到以下结果

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中字符串处理的见解或链接将不胜感激

c#与Java的字符串混淆

我已经看了一下你从这里得到了什么:

var test = Convert.FromBase64String("YXBwLW5hbWUAAAAAAAAAAA==");
var builder = new StringBuilder();
builder.Append(System.Text.Encoding.ASCII.GetChars(test));

答案是字符串"app-name",在末尾加载null(0)字符。

您可以尝试通过在返回builder.ToString()之前添加这一行来删除所有空字符:

builder.Replace("'0", null);

这可能有帮助,也可能没有帮助,这取决于你对返回的字符串做了什么。

First

builder.Append("pBlockData: " + this.pBlockData + "'n");

不做你认为它做什么,特别是如果pBlockData是一个字节数组,你会得到这样的东西(从scriptcs输出):

> byte[] data = new byte[11];
> StringBuilder sb  = new StringBuilder();
> sb.Append("data = ")
{Capacity:16,MaxCapacity:2147483647,Length:7}
> sb.Append(data);
{Capacity:32,MaxCapacity:2147483647,Length:20}
> sb.ToString()
data = System.Byte[]

第二个c#字符串(。. NET字符串(通常)是UTF-16,所以它并不真正知道如何处理显示字节。不管它是bas64编码的还是ASCII编码的,或者是French pickle;-),运行时只是将其视为二进制。也不需要null终止,字符串的长度作为字符串对象的属性保留。

因此,您需要在输出之前将字节数组转换为UTF-16字符数组或字符串。如果字节数组包含有效的ASCII,您可以查看'System.Text.ASCIIEncoding.ASCII.GetDecoder() '。将'方法转换为完成此操作的一种方法