我在将包含 8 个字节作为字符(ascii)的 String^ 转换为 double 时遇到问题。我想把这 8 个字符转换成二进制。
你会推荐什么在 C++/cli 中进行这种转换?
我试图使用 Marshal::Copy、Double::TryParse 等。
也许我使用了错误的参数规格,但我真的失去了最后的希望。必须有一些容易进行这种转换的东西。
谢谢。
我在将包含 8 个字节作为字符(ascii)的 String^ 转换为 double 时遇到问题。我想把这 8 个字符转换成二进制。
你会推荐什么在 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
不确定它是否完全安全,但在您的上下文中尝试它应该是一个好的开始,以确保它是可行的。:)