Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在位置0处插入字节,并将剩余的数据位右移_Java_Bit Manipulation_Iso8583 - Fatal编程技术网

Java 在位置0处插入字节,并将剩余的数据位右移

Java 在位置0处插入字节,并将剩余的数据位右移,java,bit-manipulation,iso8583,Java,Bit Manipulation,Iso8583,我真的在努力完成这篇文章,任何想法或建议都会对我有很大帮助。我的问题是: 我正在处理层,数据元素32被定义为n..11,这意味着该元素是数值的,长度可变,最大大小为11 这需要以二进制格式(而不是ASCII)发送 我们需要显示LLNN,ex ISO二进制原始数据应该是这样的:11 06 01 04 00 00 int nBytes=1; for (int i = nBytes - 1; i >= 0; i--) { buf[i] = (byte)(length & 0xFF

我真的在努力完成这篇文章,任何想法或建议都会对我有很大帮助。我的问题是:

  • 我正在处理层,数据元素32被定义为n..11,这意味着该元素是数值的,长度可变,最大大小为11

  • 这需要以二进制格式(而不是ASCII)发送

  • 我们需要显示LLNN,ex ISO二进制原始数据应该是这样的:11 06 01 04 00 00

  • int nBytes=1;
    for (int i = nBytes - 1; i >= 0; i--) {
        buf[i] = (byte)(length & 0xFF);
        length >>= 8;
    }
    outstream.write(buf);
    
    到目前为止,我能够用BCD(06 01 04 00)填充大小为6的字节[]数组(11/2)+(11%2)。我得到了计算为11的字段的总长度,现在我需要在字节[0]处插入这个值,11不是0B,即0001 0001压缩为一个字节
    字节[]
    为11,我的逻辑如下所示,当我给出nBytes=1(BCD ISO中的前255个字符)时,它将插入长度字段值为0B 01 04 00 00 00,或者如果我将nBytes传递为2,它给了00b040000。右移逻辑出了问题

    有人能帮我纠正下面的逻辑,把结果变成11 06 01 04 00 00吗

    int nBytes=1;
    for (int i = nBytes - 1; i >= 0; i--) {
        buf[i] = (byte)(length & 0xFF);
        length >>= 8;
    }
    outstream.write(buf);
    
    我认为执行您正在寻找的BCD转换:

    class T {
        public static byte toBCD(int n)
        {
            // a*10 + b -> a*16 + b;
            byte a = (byte)(n / 10);
            byte b = (byte)(n % 10);
    
            return (byte) (a * 0x10 + b);
        }
    
        public static void main(String[] args)
        {
            assert(toBCD(11) == 0x11);
            assert(toBCD(28) == 0x28);
        }
    }
    

    我最终使用了双字节数组对象。保存原始请求并以十进制计算字段长度,将其放入第一个位置,即辅助字节数组的0索引,并将原始字节数组追加到此位置

    你为什么要动一下?您不能创建发送ISO 8583消息所需的字节吗?添加一个包含11个十六进制或17个十进制的字节,并在其他字节前加上前缀。@Gilbert:谢谢你找回Gilbert,我可以,考虑避免创建多个数组对象…如果能注意右移,那就太好了…我已经根据您的输入实现了解决方案…只需在主机端检查它是否能正确解码…我将很快向您更新此新修复程序的运行情况。@Gilbert:17十进制方式在ISO系统上运行得非常好…感谢您的支持你能解释一下吗?通过
    (11/2)+(11%2)
    ?和wat是什么意思,n字节又是什么意思?此外,buf[]的内容是什么?