C ++ / cli:如何将包含Bytes的String转换为double

时间:2012-12-23 15:34:34

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

我在将包含8个字节的字符串^作为字符(ascii)转换为double时遇到问题。 我想取这8个字符并将它们转换为二进制。

您建议在C ++ / cli中进行此转换?

我试图使用Marshal :: Copy,Double :: TryParse等

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

感谢。

1 个答案:

答案 0 :(得分: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

不确定它是否完全安全,但在您的环境中尝试它应该是确保其可行性的良好开端。 :)