如何使用 ASCII 数据分配字符?
Posted
技术标签:
【中文标题】如何使用 ASCII 数据分配字符?【英文标题】:How to assign a character using ASCII data? 【发布时间】:2011-01-02 06:06:09 【问题描述】:如何将 ASCII 字符存储到“char”字面量中?
我想用作特殊字符的 ASCII 字符是文件分隔符:
十进制:028 八进制:034 十六进制:01C 二进制:00011100
// This works in C/C++, but not C#:
static const char FS = 0x1C; // File Separator
【问题讨论】:
注意:没有非托管 C# 之类的东西。 混乱:是的,有:msdn.microsoft.com/en-us/library/aa288474%28VS.71%29.aspx 它仍然被管理。你可以做不安全的事情。 @Chaos:这只是我知道如何解释我的情况的最佳方式。不知道这是一个简单的演员表,我想我必须做一些时髦的事情才能让它工作(比如'char FS = Convert.ToChar(char.GetType(funky-funk#8));')调用“不安全”块。除了“管理”之外,我想要的还有更好的词吗? 不,您的问题只是处理 C++ 和 C# 之间的语法差异。 【参考方案1】:静态修饰符不是必需的,您必须将 int 显式转换为 char。
const char FS = (char)0x1C;
【讨论】:
谢谢。我想这很简单,我什至没有考虑演员表。【参考方案2】:我想'\u001C'
会起作用。
【讨论】:
今天将其更改为我的答案,因为我看到这是我实际使用的版本。谢谢马克。顺便说一句:挖掘节日头像。我似乎无法改变我的 Gravatar。每次我过去尝试过,我的头像都会恢复,所以一些 SO Assigned 通用。【参考方案3】:const char FS = '\x1C';
【讨论】:
\x
转义序列是纯粹的邪恶 - 至少对于字符串。例如,“\x9Bad 编译器”和“\x9Good 编译器”之间的区别很难发现。不过,我猜对单个字符来说还不错。不过我自己还是会使用\u001c
。
ChaosPandion 首先得到了它。我曾尝试使用'\1C',但没有奏效。谢谢!
@Jon Skeet:但是您可以轻松地使用带有四位数字的\x
,就像使用带有四位数字的\u
。例如"\x0009Bad Compiler"
将与"\u0009Bad Compiler"
编译相同。而\x
对于char
文字更方便,因为您没有必须 使用所有四位数字。正如您所指出的,如果您不小心,对于字符串可能会很棘手。但是如果没有歧义(比如序列后面没有字母数字),那么我还是更喜欢\x
。顺便说一句,我强烈反对使用 evil 这个词来表示“一个棘手或危险的结构”。
所以我很邪恶。我乱穿马路,我双浸,我使用 \x。哇哈哈!!!不过说真的,一旦你一头或两次遇到这种情况,你就不会再犯同样的错误了。考虑到调试此类问题的乐趣,大脑将为此专门设置一个脑叶。【参考方案4】:
如果您要将其写入流,请注意编码; .NET 的字符和字符串是 UTF-16 编码的,因此实际上将被写为001C
(或1C00
,取决于字节序;我不记得是哪个)。您可以通过在打开流时指定适当的编码来避免此问题。
编辑:实际上,情况并非如此!刚刚对其进行了测试,StreamWriter
等人的默认行为是使用系统当前的 ANSI 代码页(通常是 ISO-8859-1),因此它实际上是以预期的 8 位格式编写的。当然,这会对非 ANSI 字符产生意想不到的结果。
【讨论】:
@Inquisitor:Jon Skeet 和 Marc Gravell 的使用 '\u001C' 的建议会防止 UTF-16 流滑落吗? @jp2code:我实际上是错的,所以没关系 :) 但是,不,分配字符的方式不会影响它写入流的方式。以上是关于如何使用 ASCII 数据分配字符?的主要内容,如果未能解决你的问题,请参考以下文章
如何在分配的空间中存储以 ASCII 转换的计数器寄存器中包含的值
PHP:如何将 ASCII 转换为 HTML 或如何解码字符串
如何使用 Encoding.ASCII.GetBytes 处理大量数据? (抛出 OutOfMemoryException)