我正在使用PPM格式幻数P3 http://netpbm.sourceforge.net/doc/ppm.html
我有一个非常长的无符号字符,它是字符空格和换行符的下降。当我把它打印出来时,很好地打印出这样的例子......
01 30 03 19 02 39 01 91 39 81 45 92 40 29 10 93
02 91 29 04 19 02 19 04 19 03 94 10 92 03 01 19 02
10 02 93 04
等。 你看到有些线条比其他线条长。这个巨大的字符串是从一个文件读入并放入一个unsigned char *。我的问题是,当我去更改值时,请更改每个第二个字符,例如......
01 becomes 00 //changing the LSB
30 becomes 31
这样做时遇到了问题。当我到达终点时,问题就出现了。我的if语句没有检测到行结束令牌,因此当它去抓取下一个值时它没有抓住第二个数字,而是抓住了第一个。
我检测行尾的if语句无效......
if(num[count] == '\n' || num[count] == '\0' || num[count] == '\r' || num[count]== '\t')
{
count = count + 2;
}
这个if语句的目标是检测新行和进度计数2,所以我用的下一个值将是下一行02的2。我不确定为什么我无法检测到行结尾令牌,因为当我打印出unsigned char *时,肯定会出现一些问题,它会以上述方式用新行打印。
答案 0 :(得分:0)
如果您的变量num
具有类型unsigned char *
,则count
变量中的每个增量对应于一个八位字节(即一个字节)的增量。一个八位字节对应于两个十六进制值。因此,输入开头的01
代表一个八位字节。 0
表示四个最高有效位,1
表示四个最低有效位。
因此,当你将计数增加2时,我假设你也在if语句之外做了,你实际上是在跳过其他每一个字符。
如上所述,误解是您看到的每个十六进制值对应于一个字节,而不是一个字节,而是一个字节内的4位。您将描述要执行的过程"更改LSB"。但是你给出的例子实际上是改变了最不重要的四位,而不是最低有效字节。