【发布时间】:2021-07-16 07:38:33
【问题描述】:
如果您有重复或简单的问题,请提前抱歉!我找不到答案。
我正在使用 Delphi 制作的 dll。可以使用 DLL 将数据发送到设备。但是,在发送数据时,某些字符串不被接受或被写入空白。发送到设备的数据存储在 txt 文件中。它是使用 txt 文件第三方程序生成的。
也就是说,我认为字符串是不确定的格式。如果我以 utf-8 格式发送,它会接收所有信息。但是当时的一些字符串???? ???? 仍然存在。
我的许多文本都使用西里尔字母。
我做了什么:
// string that send to device
[MarshalAsAttribute(UnmanagedType.LPStr, SizeConst = 36)]
public string Name;
当我这样做时,设备只收到了 100 个数据中的 10 个。 如果我使用 UTF-8 编码:
byte[] bytes = Encoding.Default.GetBytes(getDvsName[1].ToString());
string res = Encoding.UTF8.GetString(bytes);
以这种方式获得了所有数据,但是太多的字符串变成了??? ????。
我也试过这样:
static private string Win1251ToUTF8(string source)
{
Encoding utf8 = Encoding.GetEncoding(«utf-8»);
Encoding win1251 = Encoding.GetEncoding(«windows-1251»);
byte[] utf8Bytes = win1251.GetBytes(source);
byte[] win1251Bytes = Encoding.Convert(win1251, utf8, utf8Bytes);
source = win1251.GetString(win1251Bytes);
return source;
}
以上所有方法都没有帮助。我怎样才能以正确的格式接收传入的信息?还有其他方法吗?
【问题讨论】:
-
如果你想获取字节[]的字符串表示,你会想要使用
Convert.ToBase64String。 -
你试过 Encoding.Unicode 吗? DLL 文档是否表明它使用哪种编码?
-
听起来您应该通过二进制数据 (
byte[]) 而不是字符串与 DLL 进行通信。 “重新编码”字符串总是会丢失,因为当你得到损坏的字符串时,你通常已经丢失了数据。 -
@B.O.B.文档中没有关于编码的内容。在文档中仅包含
public string Name; // Product Name, 36 characters。 -
好吧,在不知道您尝试与之交互的 API 的情况下,不确定我们能否提供更多帮助。如果没有关于 API 的更多信息,我只能想到一件事:你确定它是 LPSTR 吗? (docs.microsoft.com/en-us/openspecs/windows_protocols/ms-dtyp/…) 如果你正在吞噬字符,它可能是其他类似 LPWSTR (docs.microsoft.com/en-us/openspecs/windows_protocols/ms-dtyp/…) 的东西。在 .Net 中使用非 .Net DLL 时,有许多不同类型的字符串...