有符号字节和奇偶校验字节之间的差异

时间:2010-11-04 22:53:17

标签: c++ byte

我正在读取字节流中的一些字节,它们看起来像这样:

OUTPUT:
48 -84 -79 -84 -73 -79 46 48 -84

SHOULD BE:
48  44  49  44  55  49 46 48  44

我想将它们变成ascii字符,但那些否定符号让我感到困惑。这让我觉得我不懂签名字节。我到底在做什么呢?

9 个答案:

答案 0 :(得分:9)

看起来最高位用作奇偶校验位,而您的代码假定它是符号位

  • 48 = 011 0000:设置2位 - >加0 - > 0011 0000 = 48
  • 44 = 010 1100:设置3位 - >加1 - > 1010 1100 = -84
  • 49 = 011 0001:设置3位 - >添加1 - > 1011 0001 = -79
  • 等......

解决方案:使用(value & 0x7f)屏蔽最高位。

答案 1 :(得分:7)

例如:

 84 (dec): 0101 0100
-84 (dec): 1010 1100

 44 (dec): 0010 1100

后者(-84)是前者的两个补码(84)。使用带符号的字节编码,如果设置了最高位,则表示负数。

巧合的是,44(dec)在有符号字节中编码为-84,但其最高位清晰。

答案 2 :(得分:4)

您最有可能担心的是7位ASCII字符集(例如,所有美国英语都在那里)。由于您一次读取8位,最简单的方法是屏蔽最高位(即符号位)

在C:

char letter = dataByte& 0x7F的;

-84,其顶部位被屏蔽,为44。

答案 3 :(得分:2)

将它们作为无符号字节读取。

解释:当您将其解释为带符号的字节时,第一位(最高)被视为+/-符号,而不是正常的二进制数字。

答案 4 :(得分:2)

这是一个8位有符号整数。与32位整数一样,但范围较小。

答案 5 :(得分:2)

@Stephano现在我们到了某个地方:)

最有可能的是,UART设置为7个数据位+ 1个奇偶校验位(高位为奇偶校验位),因此字节中的设置位数必须是偶数。

您可以将其用于错误检查,然后重置它以获得真正的7位ASCII字符。

答案 6 :(得分:1)

什么是“字节”?在C ++语言中,“byte”与char类型是同义词,它只是一个普通的整数类型,可以是有符号或无符号的。在您的平台上,类型char可能已签名(如果您正在使用char),这就是您获得签名值的原因。

换句话说,很可能你自己使用了签名类型来读取值,所以期望你得到签名的结果。

当然,这只是猜测,因为没有看到代码,就无法说出你正在做什么。

答案 7 :(得分:0)

您的应用程序可能会在将它们写出之前将它们转换为int。你用来生成输出的代码是什么?

答案 8 :(得分:0)

当您从任何来源(文件,网络套接字等)读取数据时,它只是一个1和0的流。通常它们以八个为一组(即以字节为单位)传递,但完全取决于您的代码来决定如何解释这些位。

假设一个文件包含这个字节:

10101100

如果将其解释为带符号的字节,则表示值为-84(十进制)。

如果将其解释为无符号字节,则它表示十进制值172。

如果您的代码正在将值读入char类型的变量中,那么您会看到-84,因为默认情况下会对char进行签名。如果将变量声明更改为unsigned char,那么您将看到172.在任何一种情况下,基础位都是相同的,您只是告诉计算机以不同的方式解释它们。

相关问题