8 バイトを (ASCII として) 文字として含む String^ を double に変換する際に問題があります。これらの 8 文字を取得し、バイナリを double に変換したいと考えています。
C++/cli でこの変換を行うには、何をお勧めしますか?
Marshal::Copy、Double::TryParse などを使用しようとしていました。
パラメータの指定を間違えたのかもしれませんが、本当に最後の望みを失いました。この変換を行うには、何か簡単なものがあるはずです。
ありがとう。
8 バイトを (ASCII として) 文字として含む String^ を double に変換する際に問題があります。これらの 8 文字を取得し、バイナリを double に変換したいと考えています。
C++/cli でこの変換を行うには、何をお勧めしますか?
Marshal::Copy、Double::TryParse などを使用しようとしていました。
パラメータの指定を間違えたのかもしれませんが、本当に最後の望みを失いました。この変換を行うには、何か簡単なものがあるはずです。
ありがとう。
悪いニュースは、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
完全に安全かどうかはわかりませんが、実際の状況で試してみることは、実行可能であることを確認するための良い出発点になるはずです. :)