2010-10-08 71 views
8

我知道WAV文件格式使用16位样本的有符号整数。它也以小端顺序存储它们,意味着最低的8位首先出现,然后是下一个等等。是第一个字节上的特殊符号位,还是始终位于最高有效位(最高值)上的特殊符号位, ?Little-Endian有符号整数

含义:
哪一个是WAV格式的符号位?

++---+---+---+---+---+---+---+---++---+---+---+---+---+---+---+---++ 
|| a | b | c | d | e | f | g | h || i | j | k | l | m | n | o | p || 
++---+---+---+---+---+---+---+---++---+---+---+---+---+---+---+---++ 
--------------------------- here ->^------------- or here? ->^

我还是p?

+1

至于你的图片,它取决于你如何绘制字节内的位。 :P如果你画他们像一个big-endian(高位第一),那么它会是“我”。如果你拥抱这一切的小端,那么“p”。无论哪种方式,它将是最后一个字节的高位。 – cHao 2010-10-09 00:13:53

回答

9

符号位是任何二进制补码机器上最显著位(如86),因此,将在最后一个字节的小尾数格式

只是因为我不想是一个不包括ASCII艺术... :)

+---------------------------------------+---------------------------------------+ 
|    first byte    |    second byte    | 
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+ 
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+ 
    ^--- lsb            msb/sign bit -----^ 

位基本上是由大多数人如何看待他们,这就是为什么高字节为最后代表的“倒退”。但都是一致的; “位15”出现在“位0”之后,就像地址应该工作一样,并且仍然是该字的最高有效字节的最重要位。你不需要做任何事情,因为硬件会根据字节而不是最低级别进行通信 - 所以当你读取一个字节时,它看起来和你期望的完全一样。只要看看你的单词中最重要的部分(或者它的最后一个字节,如果你一次读一个字节),并且有你的符号位。

但是请注意,二进制补码并没有完全指定一个特定位作为“符号位”。这只是数字表示方式的一个非常方便的副作用。对于16位数字,-x等于65536-x而不是32768 + x(如果高位是严格符号的话就是这种情况)。

+3

如果你读的是实际的字节而不是ASCII表示,那么是的 - 低8位(因此LSB)总是*是第一个字节,高8位(包括MSB)总是*是最后的 - 这就是“小端”的意思。但是字节内的位被存储,但是硬件想要存储它们。除非您正在构建硬盘驱动器,否则您不必知道或关心它是如何工作的。 – cHao 2010-10-08 21:12:46

+0

我正在谈论它如何以WAV文件格式存储,而不是以硬件存储。我读到样本存储为小端符号的16位整数。 – 2010-10-08 22:49:33

+0

他们是。这恰好与x86处理器处理16位值的方式非常接近,这就是为什么它们以这种方式存储的原因。 (Windows是为兼容x86的CPU生产的。)无论哪种方式,符号位都是该值的最后一个字节的最高位,如上所述。如果'byte2&0x80'非零,那么你的数字是负数。 – cHao 2010-10-08 23:59:06

9

符号整数,小尾数:

 
byte 1(lsb)  byte 2(msb) 
--------------------------------- 
7|6|5|4|3|2|1|0 | 7|6|5|4|3|2|1|0| 
---------------------------------- 
       ^
        | 
       Sign bit 

你只需要关心自己与当读/写短整型一些外部媒体。在你的程序中,无论你是在一个大的还是小的endian平台上,符号位都是最重要的位。

相关问题