【问题标题】:C++/cli: How to convert String containing Bytes as characters to doubleC++/cli:如何将包含字节作为字符的字符串转换为双精度
【发布时间】:2012-12-10 08:06:57
【问题描述】:

我在将包含 8 个字节作为字符(ascii)的 String^ 转换为 double 时遇到问题。 我想把这 8 个字符转换成二进制。

您会建议在 C++/cli 中进行什么转换?

我尝试使用 Marshal::Copy、Double::TryParse 等。

也许我使用了错误的参数规格,但我真的失去了最后的希望。 必须有一些简单的方法可以进行这种转换。

谢谢。

【问题讨论】:

  • 您不能将字节存储在 System::String 中,Unicode 规范化会破坏它们的值。
  • 你的话没有意义,SerialPort 有一个 Encoding 属性。是时候让你的代码说话了,发布一个 sn-p,显示你如何从端口读取数据。
  • "Serious" 解决了它...但感谢您的关心 ;)

标签: string c++-cli double type-conversion


【解决方案1】:

好吧,坏消息是 System.String 类在内部仅使用 Unicode 编码

所以如果你给它字节,它会将它们映射到隐藏原始值的内部编码。

好消息是您可以使用 System.Text.Encoding 类来检索对应于 unicode 字符的 8 位值。

这是一个示例:

#include <iostream>

using namespace System;
using namespace System::Text;

int main()
{
    int n = 123456;
    double d = 123.456;

    std::cout << n << std::endl;
    std::cout << d << std::endl;

    char* n_as_bytes = (char*)&n;
    char* d_as_bytes = (char*)&d;

    String^ n_as_string = gcnew String(n_as_bytes, 0, sizeof(n));
    String^ d_as_string = gcnew String(d_as_bytes, 0, sizeof(d));

    Encoding^ ascii = Encoding::GetEncoding("iso-8859-1");

    array<Byte>^ n_as_array = ascii->GetBytes(n_as_string);
    array<Byte>^ d_as_array = ascii->GetBytes(d_as_string);

    cli::pin_ptr<unsigned char> pin_ptr_n = &n_as_array[0];
    cli::pin_ptr<unsigned char> pin_ptr_d = &d_as_array[0];

    unsigned char* ptr_n = pin_ptr_n;
    unsigned char* ptr_d = pin_ptr_d;

    int n_out = *(int*)ptr_n;
    double d_out = *(double*)ptr_d;

    std::cout << n_out << std::endl;
    std::cout << d_out << std::endl;

    return 0;
}

这应该给你:

123456
123.456
123456
123.456

不确定它是否完全安全,但在您的上下文中尝试它应该是一个好的开始,以确保它是可行的。 :)

【讨论】:

  • 谢谢“说真的”你的帖子很有帮助。
  • 我还有一个问题……不应该是我们指向的内存被删除了吗?
  • 在示例中,仅分配了托管内存,因此当(更准确地说:之后的某个地方)不再使用时,对象将被自动进行垃圾收集。
  • 这就是我想听到的:D
猜你喜欢
  • 2013-10-10
  • 2015-04-10
  • 1970-01-01
  • 2014-01-01
  • 1970-01-01
  • 2011-08-11
  • 1970-01-01
相关资源
最近更新 更多