You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Encoding.ASCII.GetString()返回?源字节数组含常规字节

解决C#读取Delphi Pascal ASCII字符串的问题

问题根源

你遇到的异常是因为错误地将Pascal字符串的长度标识字节包含进了内容转换:Delphi的Pascal字符串(ShortString)首字节存储的是字符串的实际长度(十进制16即表示后面有16个ASCII字符),而你直接把这个长度字节当成字符串内容转成了字符,也就是不可打印的控制字符'',这才导致后续处理出错。

正确处理步骤

直接针对Pascal字符串的结构来解析,跳过长度字节,只转换有效内容:

  • 第一步:提取Pascal字符串的首字节,得到实际的字符长度
  • 第二步:从长度字节的下一个位置开始,读取对应长度的字节,再转换为ASCII字符串

代码示例

场景1:直接从FileStream读取

using (FileStream fs = new FileStream("yourfile.dat", FileMode.Open, FileAccess.Read))
{
    // 读取长度字节(Pascal字符串的首字节)
    byte lengthByte = (byte)fs.ReadByte();
    // 创建对应长度的字节数组存储字符串内容
    byte[] contentBytes = new byte[lengthByte];
    // 读取有效内容字节
    fs.Read(contentBytes, 0, lengthByte);
    // 转换为ASCII字符串
    string pascalString = Encoding.ASCII.GetString(contentBytes);
}

场景2:从已读取的buffer中解析

如果已经将数据读到了buffer字节数组,且Pascal字符串的首字节位于索引18处:

// 获取字符串实际长度
int actualLength = buffer[18];
// 从长度字节的下一个索引(19)开始,读取actualLength个字节
string correctString = Encoding.ASCII.GetString(buffer, 19, actualLength);

注意事项

  • 要确保actualLength不超过后续可用的字节数,避免数组越界异常
  • Delphi的ShortString长度字节最大值为255,对应最多255个ASCII字符,处理时可以做边界校验

内容的提问来源于stack exchange,提问作者Mike

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 14:00:57