【问题标题】:Finding sum of all bytes in a buffer查找缓冲区中所有字节的总和
【发布时间】:2017-06-16 13:20:27
【问题描述】:

我正在做某事,我需要计算每个发送数据的校验和。这个校验和是所有字节的4字节和的低2字节

假设我的数据为:

Bytebuffer buffer = Bytebuffer.allocate(128); // assume i have filled buffer with some data

下面是我如何找到所有字节的总和,然后得到 2 个字节中的较低值。

byte array = buffer.array();
int checksum = 0;

for(byte b : array){
  checksum += (int)b
}

checksum = (checksum & 0xff00ff) + ((checksum >> 0x08) & 0xff00ff);
short result = (short) (checksum + (checksum >> 0x10));

但是,侦听此数据的应用程序告诉我校验和错误。我的思维逻辑可能有什么问题?提前致谢

【问题讨论】:

    标签: java arrays checksum bytebuffer


    【解决方案1】:

    不要从缓冲区的支持array() 中读取。您通常不应直接访问该数组。它忽略了缓冲区的限制和位置。相反,请使用 get() 方法。批量获取:

    byte[] bytes = new byte[buffer.remaining()];
    buffer.get(bytes);
    

    或个人得到:

    while (buffer.hasRemaining()) {
        checksum += buffer.get() & 0xff;
    }
    

    请注意,如果您已用put() 调用填满缓冲区,则需要调用flip()

    在一系列通道读取或 put 操作之后,调用此方法以准备一系列通道写入或相关 get 操作。

    【讨论】:

    • 谢谢,原来的缓冲区似乎正在被修改。有没有办法不这样?
    • ByteBuffers 就是这样工作的。它们就像带有定位标记的文件,在您读写时会更新。这不是你应该尽量避免的事情。
    猜你喜欢
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多