这是我第一次来到这个论坛,我想从这个问题开始。据我所知,在C中,字符数据类型是8位长,但当你使用这种数据类型来传输ASCII信息时,它仍然是8位,但1位是奇偶校验位,对吗?
如果这是正确的,我的问题是,你能把包含奇偶校验位的ASCII字符传输到接收器吗?因为如果我的代码是:。。。。。char x=0b01111000;。。。。。它被接收到"x",但如果我的代码是:。。。。char x=0b11111000;。。。。它没有收到"x",但奇偶校验位在1中,我的"x"数据中有4个"1",所以我不知道什么时候使用奇偶校验位,也不知道我做错了什么。提前感谢您的回答!
据我所知,在C中,字符数据类型为8位长,
在任何现代通用计算机上,是的,这是非常确定的。但这并不是C本身的要求,而且您可以在今天使用的机器中找到char
大于8位的机器。
但当您使用这种数据类型来传输ASCII信息时,它仍然有8位长,但1位是奇偶校验位,对吗?
否。CCD_ 2的比特都是该CCD_ 3值的数据的一部分。它们不会被用于其他目的。大多数现代传输介质和协议都是8位精简的,这意味着它们保留了传输的每个8位单元的所有8位。
过去有一些媒体和协议不是8位清理的,但现在你可能遇到其中一种的唯一方法是明确地为其配置串行接口。即便如此,将其视为数据位被重新用于其他用途也是不正确的。在任何情况下,都不需要手动操作奇偶校验位。它们在硬件中对您透明地进行处理。
更重要的是,您的C实现的默认执行字符集几乎可以肯定是而不是ASCII。它很可能是与ASCII兼容的,例如UTF-8编码的Unicode或ISO-8859编码家族之一,但即使这样也不是一个安全的假设。
我不知道何时使用奇偶校验位
你没有。不能。在首先有奇偶校验位的情况下,您无法访问它们。
或者我做错了什么。
您正在手动将奇偶校验编码到数据中,并期望除您之外的其他人能够识别并关心这一点。如果你在一端手动将奇偶校验编码到数据中,那么你需要在另一端手动解码。为了获得哪怕是最微小的值,您还需要在收到奇偶校验编码数据时手动测试,以捕捉发生的任何奇偶校验错误。我想我从来没有听说过有人这样做(在逐个字符的基础上使用字符数据(。
奇偶校验位通常对应用程序代码不可见,它们在传输层上使用,在后台进行隐形处理。例如,RS-232,一种常见的串行标准,可以使用奇偶校验位,但这些奇偶校验位永远不会出现在数据流本身中,只有在检查实际电信号时才可见。
ASCII是一种7位编码标准,不包括任何类型的奇偶校验位。如果在您接收到的字符上设置了最高位,那么它可能是乱码或无意中使用了UTF-8。
如果你有传输错误,你应该使用至少像CRC一样可靠的东西来检测它们,如果你发送的数据量较大,也应该使用像SHA2-256这样更强大的东西。
当您使用此数据类型[
char
]来传输ASCII信息时
C标准不包括数据传输。如何传输数据的详细信息属于传输协议的规范(无论您使用哪种协议(。
通用协议是通用的,所以通常有库(或者硬件/固件(可以处理混乱的细节。如果您在传输协议中使用这样的库,您只需以库所需的任何格式提供数据,库就会担心奇偶校验位。
如果没有这样的库可用,您将不得不查阅协议规范以了解预期内容。每个字符可以作为7位加一个奇偶校验位(不太可能(传输,也可以作为8位加奇偶校验位传输,甚至可以作为其他字符传输。对于不可靠的传输,单个奇偶校验位可能是不够的,因此它归结为发送方和接收方具有相同的期望。