0

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

你会推荐什么在 C++/cli 中进行这种转换?

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

也许我使用了错误的参数规格,但我真的失去了最后的希望。必须有一些容易进行这种转换的东西。

谢谢。

4

1 回答 1

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

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

于 2012-12-23T23:57:03.313 回答