Android 从字节数组确定x和y的高字节和低字节

Android 从字节数组确定x和y的高字节和低字节,android,printing,bluetooth,Android,Printing,Bluetooth,我想用他们的SDK将Android位图发送到打印机(移动蓝牙打印机Bixolon SPP R-200),我可以将位图转换为字节数组。为了便于参考(以及理解我所做的),请查看Bixolon命令手册。我就是这样做的: 向打印机发送命令,告诉它我希望如何使用以下命令对齐打印输出(左=0,右=2,中心=1): byte[] command = { 27, 97, 0 }; 27和97是Bixolon命令手册中的命令-零表示“左对齐”。然后,我使用SDKs write(byte[])命令将此命令

我想用他们的SDK将Android位图发送到打印机(移动蓝牙打印机Bixolon SPP R-200),我可以将位图转换为字节数组。为了便于参考(以及理解我所做的),请查看Bixolon命令手册。我就是这样做的:

向打印机发送命令,告诉它我希望如何使用以下命令对齐打印输出(左=0,右=2,中心=1):

    byte[] command = { 27, 97, 0 };
27和97是Bixolon命令手册中的命令-零表示“左对齐”。然后,我使用SDKs write(byte[])命令将此命令发送到打印机(成功)

下一步就是我遇到的问题:我想将“打印光栅位图像”命令发送到打印机,第一部分很简单:

    byte[] command2 = { 29, 118, 48, 0, 0, 0, 0, 0 };
29、118和48共同组成了名为“GS v 0”的命令(在上述数字上使用ascii转换图时进行直译),如参考Bixolon手册第126页所述。第一个零将水平和垂直DPI设置为203

现在我遇到的问题是:根据手册,剩余的4个零必须替换为:

xL  xH  yL  yH  d1...d 
我假设是x位低位字节,x位高位字节,y位低位字节等等。。。(不确定d1…d代表什么?)

在SDK中,他们用以下代码填充最后4个字节:

    int width = myBitmap.getWidth();
    int height = myBitmap.getHeight();
    int bytesOfWidth = width / 8 + (width % 8 != 0 ? 1 : 0);

    dimensionCommand[4] = (byte) (bytesOfWidth % 256);
    dimensionCommand[5] = (byte) (bytesOfWidth / 256);
    dimensionCommand[6] = (byte) (height % 256);
    dimensionCommand[7] = (byte) (height / 256);
但我不明白为什么。这就是计算x/y位置的高字节和低字节的方法吗

但是-将此命令发送到打印机也可以工作,在最后一步中,已转换为字节数组的位图也成功传输(至少没有发生IO错误),但没有打印任何内容(尽管纸张移动,并且似乎在纸张左侧打印了两个像素)。所以我怀疑上面对位图的x和y坐标的高字节和低字节的计算是错误的

int bytesOfWidth = width / 8 + (width % 8 != 0 ? 1 : 0);
dimensionCommand[4] = (byte) (bytesOfWidth % 256);
dimensionCommand[5] = (byte) (bytesOfWidth / 256);
看起来可疑。我对宽度的计算和对高度的计算是一样的。我还将使用按位AND和位移位,而不是
%
/
运算符,这两种运算符相比速度相当慢:

int width = myBitmap.getWidth();
int height = myBitmap.getHeight();

dimensionCommand[4] = (byte) (width & 0xFF);
dimensionCommand[5] = (byte) ((width >> 8) & 0xFF);
dimensionCommand[6] = (byte) (height & 0xFF);
dimensionCommand[7] = (byte) ((height >> 8) & 0xff);

失去了百分之十的宽度计算,这是没有意义的。只需将宽度穿过


此标头后面的字节d1、d2、…d3是光栅*d*ata。根据这一点,光栅数据是每像素1字节,而不是像我认为你前面的问题假设的那样1位

谢谢你的建议-我尝试过,但仍然没有改变-但是这可能是因为打印机通信的另一个问题,所以你的答案可能是正确的,我会继续尝试更多。你的意思是像Aleks建议的那样传递它,或者简单地使用:dimensionCommand[4]=(字节)(宽度);dimensionCommand[5]=(字节)(宽度);dimensionCommand[6]=(字节)(高度)。。。没有任何计算?另外一点:我正在使用Bixolon的SDK方法BxlBitmap.bitmap2printerData(位图、宽度、级别)转换我的位图(使用Bitmap.Config.RGB_565创建),但是该方法做了很多事情,所以我不能保证我的位图不会出错。但是SDK使用这种方法来打印他们的位图,这与我的打印尝试相反。我没有看到Aleks的建议,但是的,这是完全正确的。谢谢你们,我接受了ALex的回答,因为我认为他有点快(但我看不到确切的时间戳),不幸的是这对打印没有帮助,但如果它是正确的,我想我迟早会让它工作的。有一件事我不明白:Bixolons SDK打印工程(我的不是),他们做了奇怪的bytesOfWidth计算。。。我真想知道它的目的是什么。。。也许他们在迎合一些奇怪的打印机怪癖?