我在github上使用seikichi的一个名为tiff.js的LibTIFF C代码的编译Emscripten端口。在我的代码中,我需要获得一些TIFF标签。在tiff.js中,您可以调用tiff.getField(标记值)。我需要的一个标签是ROWSPERSTRIP,它是278所以要得到这个标签,我打电话如下:
var rps = tiff.getField(278); //return rows per strip tiff tag
这似乎适用于一些较小的值1到176(不完全确定吗?)但我有几个文件,AsTiffTagViewer报告为每个条带224行和一个文件,每个条带746行。但是,tiff.js会将这两个值分别错误地报告为6和1。我正在逐步调试tiff.js中的调试器,并注意到它来自一个包含以下代码的地方:
do{if(b>>>0<=65535){d=e[j+24>>1]|0;if((1<<(d&31)&c[a+40+(d>>>5<<2)>>2)]|0)==0){k=0}else{break}i=f;return k|0}}while(0);
我怀疑它很难看,因为它最好的Emscripten可以用C代码。现在我知道“&gt;&gt;”和“&lt;&lt;”但我似乎找不到任何关于“&gt;&gt;&gt;”的内容。我还没有任何想法,如果这是tiff.js中的代码部分导致tiff.getField(278)不能错误地返回每个条带值的一些较大的行(我现在所知道的是它看起来更小的行数条带值会正确返回,而较大的条带值未正确返回它会出现。
所以我的主要问题是什么是“&gt;&gt;&gt;”我的第二个问题是,是否有人对tiff.getField(278)可能无法正确处理较大值的原因有任何想法。注意:大多数其他基本TIFF标签确实返回正确的值,如tiff.getField(PHOTOMETRIC)和tiff.getField(SAMPLESPERPIXLE)......等。
提前感谢您的想法
答案 0 :(得分:6)
这是MDN
的按位零填充右移该运算符将第一个操作数移位指定的位数 正确的。向右移位的多余位被丢弃。零 位从左侧移入。符号位变为0,所以 结果总是非负面的。
对于非负数,零填充右移和符号传播 右移产生相同的结果。例如,9>&gt;&gt; 2收益2, 与9>相同的&gt; 2:
至于为什么tiff.js在你致电tiff.getField(278)
时不起作用,我不知道,我认为应该这样,而且在Github上似乎没有任何已知问题页面,但你可以尝试添加一个问题,看看开发人员是否知道。
答案 1 :(得分:2)
-3 >>> 0
是一个无符号右移0位。即该数字将转换为无符号32位整数,而不是-3 | 0
,将数字转换为32位有符号整数。
-3 >>> 0 === 4294967293
-3 | 0 === -3
11.7.3 The Unsigned Right Shift Operator ( >>> )
对左操作数执行零填充按位右移操作,操作数由右操作数指定。
生产
ShiftExpression : ShiftExpression >>> AdditiveExpression
的评估如下:
让
lref
成为评估ShiftExpression
的结果。让
lval
成为GetValue(lref)
。让
rref
成为评估AdditiveExpression
的结果。让
rval
成为GetValue(rref)
。让
lnum
为ToUint32(lval
)。让
rnum
成为ToUint32(rval)
。让
shiftCount
成为屏蔽除rnum
的最低5位之外的所有内容的结果,即计算rnum & 0x1F
。- 醇>
返回
lnum
位shiftCount
执行零填充右移的结果。空位用零填充。 结果是无符号的32位整数。