0

8 バイトを (ASCII として) 文字として含む String^ を double に変換する際に問題があります。これらの 8 文字を取得し、バイナリを double に変換したいと考えています。

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 に答える