【问题标题】:encode and decode strange .shm file data to and from base64 c#编码和解码奇怪的.shm文件数据到base64 c#
【发布时间】:2019-08-03 20:32:27
【问题描述】:

首先是一个令人沮丧的事实:https://www.base64decode.org/ 可以做我想做的事。

我正在尝试对由图像处理工具 MVTec Halcon 生成的模型文件 (.shm) 进行编码和解码(到 base64 和从 base64 解码),因为我想将它存储在一个 xml 文件中。

如果我打开它,它有这种奇怪的形式:

HSTF ÿÿÿÿ¿€          Q¿ÙG®záH?Üä4©±w?­Eè}‰@?ð ................

我正在使用这种方法对其进行编码和解码:

    public static string Base64Encode(string text)
    {
        Byte[] textBytes = Encoding.Default.GetBytes(text);
        return Convert.ToBase64String(textBytes);
    }

    public static string Base64Decode(string base64EncodedData)
    {
        Byte[] base64EncodedBytes = Convert.FromBase64String(base64EncodedData);
        return Encoding.Default.GetString(base64EncodedBytes);
    }

并像这样从 gui 调用方法:

    var model = File.ReadAllText(@"C:\Users\\Desktop\model_region_nut.txt");
    var base64 = ImageConverter.Base64Encode(model);
    File.WriteAllText(@"C:\Users\\Desktop\base64.txt", base64);

    var modelneu = ImageConverter.Base64Decode(File.ReadAllText(@"C:\Users\\Desktop\base64.txt"));
    File.WriteAllText(@"C:\Users\\Desktop\modelneu.txt", modelneu);

我对 modelneu 的结果是:

HSTF ??????          Q??G?z?H???4??w??E?}??@??

所以你可以看到有很多缺失的字符。我猜这个问题是由使用 .Default 引起的。

感谢您的帮助, 米歇尔

【问题讨论】:

  • 这似乎是编码问题。您要保存什么样的数据?
  • 他们称之为 .shm 文件。我将其存储为 .txt 文件。
  • @Michel 什么是 .shm 文件?你发布的不是Base64。将您的语言环境的代码页与 Encoding.Default 一起使用也无济于事 - 如果您无法阅读文本,则意味着它不是您的语言。这可能意味着.shm 文件根本不包含文本
  • @Panagiotis Kanavos .shm 文件是由实习生 halcon 序列化方法生成的。我也担心该文件可能根本不包含文本,但问题只是我在(ReadAllText())文件中读取的方式。我不得不像 yekanchi 所说的那样重载方法。现在我能够重用这个模型文件。供您参考: .shm 文件是“模型文件”,仅包含对象的边缘。我将它们用于图像处理。模型文件是要在图像中搜索的模板。

标签: c# .net decode encode halcon


【解决方案1】:

问题在于使用未指定的encoding 读取文件,请检查this question

正如那里提到的,您可以使用 ReadAllText 的重载来指定编码,并且对于编写您必须为 WriteAllText 指定编码我建议使用 UTF-8 编码:

var model = File.ReadAllText(@"C:\Users\pichlerm\Desktop\model_region_nut.txt",Encoding.UTF8);
var base64 = ImageConverter.Base64Encode(model);
File.WriteAllText(@"C:\Users\\Desktop\base64.txt", base64,Encoding.UTF8);

var modelneu = ImageConverter.Base64Decode(File.ReadAllText(@"C:\Users\\Desktop\base64.txt"));
File.WriteAllText(@"C:\Users\pichlerm\Desktop\modelneu.txt", modelneu);

【讨论】:

  • 谢谢!使用:ReadAllText(路径,编码。默认)。你拯救了我早上的心情。
  • OP 正在使用带有 Encoding.Default 的非常特定的编码 - 机器的语言环境
【解决方案2】:

如果您使用的是二进制数据,则根本没有理由进行文本解码和编码。这样做只会有以各种方式损坏数据的风险,即使您使用的是一致的字符编码。

只需使用File.ReadAllBytes() 而不是File.ReadAllText() 并跳过不必要的Encoding 步骤。

【讨论】:

  • 我首先尝试了这个,但不幸的是我必须把它放在一个编码为“utf-16”的xml中。所以缺少字符..
  • 您仍然可以对从 File.ReadAllBytes() 获得的字节进行 Base64 编码,您只是不需要将文件作为文本读取,然后在执行此操作之前将文本转换回字节。
  • 啊啊,现在我明白你的意思了。谢谢。
猜你喜欢
  • 2011-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-27
  • 1970-01-01
  • 2013-03-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多