要写入的数字字节/Java

要写入的数字字节/Java,java,Java,我需要从数据库中的一个表中获取一个数字,并将其放入一个宽度为4字节的字段中的ChannelBuffer 数字可以是1到9999,例如237,在ChannelBuffer中,我需要填充4个字节 ChannelBuffer bufcmd = ChannelBuffers.directBuffer(4); bufcmd.writeByte(0x00); // 1º digit of 4 bytes bufcmd.writeByte(0x00); // 2º digit of 4 bytes bufcm

我需要从数据库中的一个表中获取一个数字,并将其放入一个宽度为4字节的字段中的ChannelBuffer

数字可以是1到9999,例如237,在ChannelBuffer中,我需要填充4个字节

ChannelBuffer bufcmd = ChannelBuffers.directBuffer(4);
bufcmd.writeByte(0x00); // 1º digit of 4 bytes
bufcmd.writeByte(0x00); // 2º digit of 4 bytes
bufcmd.writeByte(0x00); // 3º digit of 4 bytes
bufcmd.writeByte(0x01); // 4º digit of 4 bytes
我如何直接用237值填充此字段

整个代码是:

String strcmd = "dyd#"; //from database

ChannelBuffer bufcmd = ChannelBuffers.directBuffer(100);

bufcmd.writeByte(0x78);
bufcmd.writeByte(0x78);
bufcmd.writeByte((5 + strcmd.length()));
bufcmd.writeByte(0x80);
bufcmd.writeByte((4 + strcmd.length()));



// TODO: convert 1 to 9999 to HEX 
// (id of command from database eg: 3)
// but filling 4 bytes
bufcmd.writeByte(0x00);
bufcmd.writeByte(0x00);
bufcmd.writeByte(0x00);
bufcmd.writeByte(0x03);


bufcmd.writeBytes(ChannelBuffers.copiedBuffer(strcmd, CharsetUtil.US_ASCII));
bufcmd.writeShort(buf.readUnsignedShort());
bufcmd.writeShort(Crc.crc16Ccitt(bufcmd.toByteBuffer(2, 4)));
bufcmd.writeByte(0x0D);
bufcmd.writeByte(0x0A);
channel.write(bufcmd);

在不知道您想要在bufcmd中使用哪种编码等的情况下,我将大胆猜测“不管使用什么字符串都可以”

int theNumber=237;//价值
字符串字符串=整数。toString(数字)//值的字符串表示形式
对于(int i=0;i 0)
{
bufcmd写入字节(0);
}
对于(int i=0;i 0)
{
系统输出打印项次(0);
}

对于(int i=0;i这将转换为大端二进制:

   int theNumber = 237;
   byte[] buf = new byte[4];
   for( int i = 0; i < 4; i++ ){
   buf[3 - i] = (byte)(theNumber & 0xFF);
       theNumber = theNumber >> 8;
   }
int theNumber=237;
字节[]buf=新字节[4];
对于(int i=0;i<4;i++){
buf[3-i]=(字节)(编号和0xFF);
编号=编号>>8;
}
请注意,java.io.DataOutputStream和类似的类具有方法writeInt(int v)和其他类型的类似方法,这简化了类似于您似乎拥有的任务

下面的代码将转换为十进制ASCII,最重要的数字在前,前导零:

   int theNumber = 237;
   byte[] buf = new byte[4];
   for( int i = 0; i < 4; i++ ){
   buf[3 - i] = (byte)(theNumber % 10 + 0x30);
       theNumber = theNumber / 10;
   }
int theNumber=237;
字节[]buf=新字节[4];
对于(int i=0;i<4;i++){
buf[3-i]=(字节)(数字%10+0x30);
编号=编号/10;
}

什么是
ChannelBuffer
?您可能会说“数字”应该是ASCII编码的十进制数字字符,还是二进制的十进制数字(0x00、0x02、0x03、0x07),“第一个”和“第四个”不是很精确,使用“最重要”等术语。您好,是二进制的十进制数字,我需要输入一个(0x00,0x00,0x00,0x01)要发送0001,您知道查看所有代码,要发送11,您想要0x00 0x00 0x00 0x0B?StringIndexOutOfBoundsException如何?应该很明显,这说明了原理,实际实现留给读者作为练习。@DusteD但如果数字有两个数字?例如:23我的缓冲区预期有4个数字,我该怎么办?@在你的实现中,代码返回的值是20307,而不是237。有什么问题吗?@cristianormoraes我不知道,我只是在上面测试了它,它在那里输出了0237。-我只是选择了一个示例来更正一个输入错误,复制粘贴代码以供自己查看。我如何将其放入ChannelBuffer?比如bufcmd.writeBytes(buf);我将您的代码放在for(inti=0;I<4;I++){bufcmd.writeByte(buf[I]);}中返回的值是20307,数字是237哪个代码?怎么做?似乎你混合了我的两个版本,这是不可取的。你每个字节存储一个十进制数字。这样,237将产生4个字节0x00,0x02,0x03,0x07。-最后一次尝试:如果数字是237,那么这4个字节中应该包含什么,请使用十六进制表示法。
public class HelloWorld{

     public static void main(String []args){
        System.out.println("Hello World");
        int theNumber = 237; // The value
        String theString = Integer.toString(theNumber); //The string representation of the value
        int len = theString.length(); //Bytes in the string
        int requiredLen = 4; // 3 = 0003, 42 = 0042
        int padding = requiredLen-len; //How many 0 we need to send first

        while( padding-- > 0 )
        {
            System.out.println( 0 );
        }

        for(int i=0; i<len;i++)
        {
            System.out.println( Character.getNumericValue(theString.charAt(i)) );
        }        

     }
}
   int theNumber = 237;
   byte[] buf = new byte[4];
   for( int i = 0; i < 4; i++ ){
   buf[3 - i] = (byte)(theNumber & 0xFF);
       theNumber = theNumber >> 8;
   }
   int theNumber = 237;
   byte[] buf = new byte[4];
   for( int i = 0; i < 4; i++ ){
   buf[3 - i] = (byte)(theNumber % 10 + 0x30);
       theNumber = theNumber / 10;
   }