当前位置: 首页 > news >正文

Netty:ByteBuf写入数据、读出数据

介绍

Netty的ByteBuf数据位置索引是0开始的。
可以用ByteBuf的getByte(int index)方法从指定位置读出一字节,这个操作不会改变ByteBuf的readerIndex 或者 writerIndex 的位置。如果index小于0,或者index + 1大于ByteBuf的容量,就会抛出IndexOutOfBoundsException异常。
可以用ByteBuf的readByte()方法从当前readerIndex 读出一字节,并且将readerIndex 的值增加1。如果ByteBuf的readableBytes的值小于1,就会抛出IndexOutOfBoundsException异常。
可以使用ByteBuf的isReadable()方法判断是否有可读的数据。当(this.writerIndex - this.readerIndex) 的值大于0,isReadable()返回true。

writeShort(int value)函数:在ByteBuf的当前writerIndex位置开始写入一个16位的整数,并且将writerIndex增加2。因为输入参数是int型,占4个字节,高位的16位被丢弃。
getShort(int index)函数:从ByteBuf的绝对位置index开始,读取1个16位的整数。这个方法不改变ByteBuf的readerIndex 和 writerIndex。

代码举例

用getByte(int index)方法正常读取数据

代码:

package com.thb;import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;public class Test {public static void main(String[] args) {		ByteBuf buf = Unpooled.buffer(1);		for (int i = 0; i < 1; i++) {buf.writeByte(0x68);}for (int i = 0; i < buf.capacity(); i++) {System.out.println(buf.getByte(i));}}}

运行输出:
在这里插入图片描述

用getByte(int index)方法不正常读取数,据抛出异常

代码:

package com.thb;import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;public class Test {public static void main(String[] args) {		ByteBuf buf = Unpooled.buffer(1);		for (int i = 0; i < 1; i++) {buf.writeByte(0x68);}for (int i = 0; i < buf.capacity() + 1; i++) {System.out.println(buf.getByte(i));}}}

运行输出:
在这里插入图片描述

用readByte()方法正常读取数据–用readableBytes()判断可读的数据字节数

代码:

package com.thb;import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;public class Test {public static void main(String[] args) {		ByteBuf buf = Unpooled.buffer(2);		for (int i = 0; i < 2; i++) {buf.writeByte(0x68);}		while (buf.readableBytes() > 0) {System.out.println(buf.readByte());}}}

运行输出:
在这里插入图片描述

用readByte()方法正常读取数据–用isReadable()判断是否有可读的数据

代码:

package com.thb;import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;public class Test {public static void main(String[] args) {		ByteBuf buf = Unpooled.buffer(2);		for (int i = 0; i < 2; i++) {buf.writeByte(0x68);}		while (buf.isReadable()) {System.out.println(buf.readByte());}}}

运行输出:
在这里插入图片描述

用getBytes(int index, byte[] dst)读取部分内容到数组中

getBytes(int index, byte[] dst)表示从ByteBuf的绝对位置index开始,拷贝部分内容到目的字节数组中。这个操作不改变ByteBuf的readerIndex 和 writerIndex。

package com.thb;import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;public class Test {public static void main(String[] args) {		ByteBuf buf = Unpooled.buffer(4);for (int i = 0; i < buf.capacity(); i++) {buf.writeByte(0x68);}byte[] data = new byte[2];// 从buf的第二个字节开始,拷贝2个字节的内容到data数组中buf.getBytes(1, data);System.out.println("数组data的内容:");for (int i = 0; i < data.length; i++) {System.out.println(data[i]);}System.out.println("buf的内容:");for (int i = 0; i < buf.capacity(); i++) {System.out.println(buf.getByte(i));}}}

运行结果:
在这里插入图片描述

用writeShort(int value)写入一个short型整数,用getShort(int index)读取一个short型整数

package com.thb;import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;public class Test {public static void main(String[] args) {		ByteBuf buf = Unpooled.buffer(4);buf.writeShort(2048);// 从buf中读取一个short型整数并打印出来,看是否和传入的相同System.out.println("从ByteBuf中读取的short型整数为:" + buf.getShort(0));}}

运行结果:
在这里插入图片描述

相关文章:

Netty:ByteBuf写入数据、读出数据

介绍 Netty的ByteBuf数据位置索引是0开始的。 可以用ByteBuf的getByte(int index)方法从指定位置读出一字节&#xff0c;这个操作不会改变ByteBuf的readerIndex 或者 writerIndex 的位置。如果index小于0&#xff0c;或者index 1大于ByteBuf的容量&#xff0c;就会抛出IndexO…...

C++(15):面向对象程序设计

面向对象程序设计概述 面向对象程序设计&#xff08;object-oriented programming&#xff09;的核心思想是数据抽象、继承和动态绑定。 1.使用数据抽象&#xff0c;可以将类的接口与实现分离&#xff1b; 2.使用继承&#xff0c;可以定义相似的类型并对其相似关系建模&#x…...

2023牛客暑期多校训练营6-A Tree

2023牛客暑期多校训练营6-A Tree https://ac.nowcoder.com/acm/contest/57360/A 文章目录 2023牛客暑期多校训练营6-A Tree题意解题思路代码 题意 解题思路 最大价值和这个数据范围&#xff0c;一眼 d p dp dp。 直接在树上并不好处理&#xff0c;问题是如何有效转化、处理…...

Vc - Qt - QPainter::SmoothPixmapTransform及QPainter::Antialiasing

QPainter::SmoothPixmapTransform是一个标志&#xff0c;用于指定绘制操作中的平滑像素变换行为。当使用QPainter绘制一幅图像时&#xff0c;设置SmoothPixmapTransform标志可以使图像变换过程更加平滑&#xff0c;减少锯齿状边缘的出现。此标志通常用于绘制缩放后图像的情况。…...

【练习】条件变量:创建三个线程 id号为ABC,三个线程循环打印自己的ID号,运行顺序为 ABCABC

题目&#xff1a; 创建三个线程 id号为ABC&#xff0c;三个线程循环打印自己的ID号&#xff0c;运行顺序为 ABCABC......要求使用条件变量 #include <stdio.h> #include <pthread.h> #include <unistd.h>//创建互斥锁 pthread_mutex_t mutex PTHREAD_MUTE…...

SpringBoot项目修改中静态资源,只需刷新页面无需重启项目(附赠—热加载)

初衷 &#x1f4a2;初衷&#x1f4a2; 因为一遍遍修改并重启项目觉得很麻烦&#xff0c;所以刚开始就自己给项目配置了热加载&#xff0c;但奈何代码更新还是慢&#xff0c;还不如我重启一遍项目的速度&#xff0c;所以放弃了自己上网找到的热加载配置。直到我debugger前端代码…...

clear_data_code_2d_model

dev update off () dev close window () ImageFiles:-./二维条码/read_image(Image&#xff0c;ImageFiles 十二维条码原图.png)dev_open_window_fit_image(Image&#xff0c;0&#xff0c;0&#xff0c;-&#xff0c;-1&#xff0c;WindowHandle)set_display_font (WindowHan…...

“深入剖析JVM:揭秘Java虚拟机的工作原理“

标题&#xff1a;深入剖析JVM&#xff1a;揭秘Java虚拟机的工作原理 摘要&#xff1a;本文将深入探讨Java虚拟机&#xff08;JVM&#xff09;的工作原理&#xff0c;包括JVM的架构、内存管理、垃圾回收、即时编译等关键技术。通过对JVM的剖析&#xff0c;我们可以更好地理解Ja…...

elementui表格table中实现内容的换行

问题 elementui 中的 table 行内的内容不能进行换行。 解决方法 思路&#xff1a; 利用 作用域插槽 结合 v-html&#xff0c;通过作用域插槽传递内容到表格行内&#xff0c;再通过 v-html 进行内容的替换。 代码&#xff1a; <el-table:data"tableData"stri…...

java 框架

目录 Spring 如何解决 bean 的循环依赖?什么是 AOP?Spring 如何实现的?BeanFactory 和 ApplicationContext 有什么区别?介绍一下 Spring bean 的生命周期Spring 的隔离级别Spring 框架用到了哪些设计模式?并举出典型例子Spring 如何解决 bean 的循环依赖? Spring中引入三…...

死锁的发生原因和怎么避免

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 例如&#xff1a;项目场景&#xff1a;示例:通过蓝牙芯片(HC-05)与手机 APP 通信&#xff0c;每隔 5s 传输一批传感器数据(不是很大) 问题描述 死锁&#xff0c;简单来说就是两个或者两个以上的线程在…...

visual studio 生成dll文件以及修改输出dll文件名称操作

目录 visual studio 生成dll文件以及修改dll文件名称一、准备测试代码二、设置导出dll属性三、生成dll文件 .lib .dll .pdb 的简单介绍dll文件使用方式lib文件使用方式1、动态链接 &#xff08;原理&#xff09;2、静态链接&#xff1a; visual studio 生成dll文件以及修改dll文…...

【Leetcode】73.矩阵置零

一、题目 1、题目描述 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例1: 输入:matrix = [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]]示例2: 输入:matrix = [[0,1,2,0],[3,4,5,2],[1,3,1…...

zabbix监控mysql容器主从同步状态并告警钉钉/企业微信

前言&#xff1a;被监控的主机已经安装和配置mysql主从同步&#xff0c;和zabbix-agent插件。 mysql创建主从同步&#xff1a;http://t.csdn.cn/P4MYq centos安装zabbix-agent2&#xff1a;http://t.csdn.cn/fx74i mysql主从同步&#xff0c;主要监控这2个参数指标&#xf…...

ARM 常见汇编指令学习 9 - 缓存管理指令 DC 与 IC

文章目录 ARM64 DC 与 IC 指令 上篇文章&#xff1a;ARM 常见汇编指令学习 8 - dsb sy 指令及 dsb 参数介绍 ARM64 DC 与 IC 指令 AArch64指令集中有两条关于缓存维护&#xff08;cache maintenance&#xff09;的指令&#xff0c;分别是IC和DC。 IC 是用于指令缓存操作&…...

落地数字化管理,提升企业市场竞争力

数字化企业管理方案是一种利用数字技术和信息系统来提升企业管理效率和运营效果的策略。 潜在的数字化企业管理方案 1、企业资源规划&#xff08;ERP&#xff09;系统&#xff1a;建立一个集成的ERP系统来统一管理企业的各项业务流程&#xff0c;包括采购、销售、库存管理、财…...

2023华数杯数学建模竞赛C题思路解析

如下为&#xff1a;2023华数杯数学建模竞赛C题 母亲身心健康对婴儿成长的影响 的思路解析 C题 母亲身心健康对婴儿成长的影响 母亲是婴儿生命中最重要的人之一&#xff0c;她不仅为婴儿提供营养物质和身体保护&#xff0c;还为婴儿提供情感支持和安全感。母亲心理健康状态的不…...

Photon之如何解决Photon Server无法在局域网使用的bug

前言 先介绍一下Photon的两个服务器服务: Photon Cloud 是一个完全托管的软件即服务 (SaaS) 解决方案。我们可以完全专注于应用程序客户端,而托管、服务器操作和扩展均由光子官方负责。 Photon Server 是一个本地服务器应用程序,我们可以在本地或指定的计算机上运行和托管。…...

Redis两种持久化方案RDB持久化和AOF持久化

Redis持久化 Redis有两种持久化方案&#xff1a; RDB持久化AOF持久化 1.1.RDB持久化 RDB全称Redis Database Backup file&#xff08;Redis数据备份文件&#xff09;&#xff0c;也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启…...

银河麒麟v10 vnc环境配置

方法一、启用自带远程桌面 银河麒麟默认已经自带远程桌面&#xff0c;如下图。此时即可用Realvnc Viewer访问该终端&#xff0c;仔细查看后自带的远程桌面是开源组件gnome-remote-desktopGNOME / gnome-remote-desktop GitLabhttps://gitlab.gnome.org/GNOME/gnome-remote-de…...

银行数据中心基础设施建设与运维管理【1.2】

2. 2 数据中心的容量 如何规划数据中心容量一直是数据中心管理者和从业者的一个重大问题。 当一个数据中心建设意向提出之后, 数据中心的建设容量到底该多大? 到底该按照哪些因素去规划数据中心的容量? 数据中心到底该按照那种方式去建设? 如何使将要建设的数据中心能够面…...

RLHF框架选型指南:Trlx/DeepSpeedChat/ColossalAI-Chat在A100和3090显卡下的显存占用实测

RLHF框架选型实战&#xff1a;Trlx/DeepSpeedChat/ColossalAI-Chat在A100与3090显卡下的性能对决 当团队面临有限的计算资源时&#xff0c;如何选择最适合的RLHF框架成为关键决策。本文将基于实际硬件环境&#xff0c;深度剖析三大主流框架在A100 40GB与RTX 3090 24GB显卡下的显…...

使用小龙虾来操作猿编程的遥控车钾

一、什么是 Q 饱和运算&#xff1f; 1. 核心痛点&#xff1a;普通运算的 “数值回绕” 普通算术运算&#xff08;如 ADD/SUB&#xff09;溢出时&#xff0c;数值会按补码规则 “回绕”&#xff0c;导致结果完全错误&#xff1a; 示例&#xff1a;int8_t 类型最大值 127 1 → 结…...

⾃动化测试常⽤函数(下)

等待通常代码执⾏的速度⽐⻚⾯渲染的速度要快&#xff0c;如果避免因为渲染过慢出现的⾃动化误报的问题呢&#xff1f;可 以使⽤selenium中提供的三种等待⽅法&#xff1a;强制等待Thread.sleep&#xff08;&#xff09;优点&#xff1a;使⽤简单&#xff0c;调试的时候⽐较有效…...

(二)从零构建嵌入式Linux:SDK编译与交叉工具链实战

1. 嵌入式Linux开发环境搭建 第一次接触嵌入式Linux开发的朋友们&#xff0c;可能会被各种专业术语搞得一头雾水。别担心&#xff0c;今天我就用最接地气的方式&#xff0c;带大家从零开始搭建开发环境。我最近刚用全志T113-i芯片完成了一个项目&#xff0c;正好把整个流程梳理…...

TypeScript的awaited类型:展开Promise的嵌套类型

TypeScript的awaited类型&#xff1a;展开Promise的嵌套类型 在异步编程中&#xff0c;Promise是JavaScript处理异步操作的核心工具&#xff0c;但多层嵌套的Promise类型往往让类型推断变得复杂。TypeScript 4.5引入的awaited类型&#xff0c;正是为了解决这一问题而生。它能够…...

【RK3588】开发板调试串口切换实战:从UART2到UART3的完整指南

1. 为什么需要切换调试串口&#xff1f; 很多开发者第一次接触RK3588开发板时&#xff0c;可能会好奇为什么默认的调试串口是UART2。这其实和开发板的设计有关——正点原子等厂商在设计开发板时&#xff0c;通常会选择最稳定的串口作为默认调试接口。但实际项目中&#xff0c;…...

C2000系列DSP通过串口实现hex/bin文件远程更新的完整指南

1. 为什么需要串口远程更新DSP程序&#xff1f; 在工业现场调试C2000系列DSP时&#xff0c;经常会遇到这样的困境&#xff1a;设备安装在密闭机柜里&#xff0c;或者部署在高空、危险区域&#xff0c;每次程序更新都需要打开机箱连接JTAG调试器&#xff0c;既费时又存在安全隐患…...

duilib DPI 高分辨率 模糊问题及解决思路

1、问题 在客户机子上,出现了这么一个问题,就是反映duilib界面模糊,CEF也模糊 经排查,客户机子分辨率 3000以上,DPI采用了 300%,而我的程序没有专门适配DPI,而是采用的如下设置,让系统强制放缩的,因为他的机子DPI 300%,所以看起来放大了3倍,就看出模糊来了。 把这…...

Python3.8镜像实战:3步创建独立环境,复现实验结果不再难

Python3.8镜像实战&#xff1a;3步创建独立环境&#xff0c;复现实验结果不再难 1. 为什么需要Python独立环境 在Python开发中&#xff0c;我们经常会遇到这样的问题&#xff1a;昨天还能正常运行的项目&#xff0c;今天突然报错了&#xff1b;在A电脑上跑通的代码&#xff0…...