我目前正在学习c ++ / cli,我想将一个字符转换为ASCII码十进制,反之亦然(例如'A'= 65)。
在JAVA中,这可以通过简单的类型转换来实现:
char ascci = 'A';
char retrieveASCII =' ';
int decimalValue;
decimalValue = (int)ascci;
retrieveASCII = (char)decimalValue;
显然这种方法在c ++ / cli中不起作用,这是我的代码:
String^ words = "ABCDEFG";
String^ getChars;
String^ retrieveASCII;
int decimalValue;
getChars = words->Substring(0, 1);
decimalValue = Int32:: Parse(getChars);
retrieveASCII = decimalValue.ToString();
我收到此错误:
mscorlib.dll中出现'System.ArgumentOutOfRangeException'类型的第一次机会异常
其他信息:输入字符串的格式不正确。
关于如何解决这个问题的任何想法?
答案 0 :(得分:1)
TextBox::Text
属性中的字符属于System::String
类型。因此,它们是Unicode字符。根据设计,Unicode字符集包括所有ASCII字符。因此,如果字符串只有这些字符,您可以转换为ASCII编码而不会丢失任何字符。否则,你必须有一个省略或替换字符或抛出异常的策略。
ASCII字符集在当前使用中有一个编码。它代表每个字节中的所有字符。
// using ::System::Text;
const auto asciiBytes = Encoding::ASCII->GetBytes(words->Substring(0,1));
const auto decimalValue = asciiBytes[0]; // the length is 1 as explained above
const auto retrieveASCII = Encoding::ASCII->GetString(asciiBytes);
十进制当然是数字的表示。除了你的解释,我没有看到你在哪里使用小数。如果你确实想在代码中使用它,它可能是这样的:
const auto explanation = "The encoding (in decimal) "
+ "for the first character in ASCII is "
+ decimalValue;
请注意auto
的使用。我省略了变量的类型,因为编译器可以解决它们。它允许代码更专注于概念而不是样板。另外,我使用const
,因为我不相信“变量”的值应该改变。这些都不是必需的。
BTW-所有这些也适用于Java。如果您的Java代码有效,那只是出于巧合。如果它已被正确编写,那么很容易转换为.NET。 Java的String
和Charset
类具有与.NET String
和Encoding
类非常相似的功能。 (但是编码为正确的术语。)它们都使用Unicode字符集和UTF-16编码作为字符串。
答案 1 :(得分:1)
比你想象的更像Java
String^ words = "ABCDEFG";
Char first = words [0];
String^ retrieveASCII;
int decimalValue = ( int)first;
retrieveASCII = decimalValue.ToString();