C# 字节数组 byte[] 关于byte的小寄巧

怎么读字节数组里面的内容

  • 先是小错误 之 ToString
  • 然后是怎么办
      • 使用UTF-8编码
      • 使用ASCII编码
      • 使用其他编码
      • 未知编码
      • 注意
  • 小demo
  • 下一个demo
  • 关于发送端的(发送新行)
  • 手搓bug编码
      • 之搓`ascii encodeing`
      • 评价为不如`BitConverter`一根

先是小错误 之 ToString

C#中,dataTemp很可能是一个字节数组(byte[]),因为你正在尝试将它转换为字符串。这两个语句的主要区别在于它们如何解释dataTemp中的字节以生成字符串。

string str = Encoding.GetEncoding("GB2312").GetString(dataTemp);  
receive_tb.AppendText(str);

这个语句首先使用GB2312编码来解码dataTemp字节数组。GB2312是一个用于简体中文字符的编码方式,如果你的数据是以GB2312编码的,那么这将正确地将字节转换为字符串。然后,这个字符串被添加到receive_tb(很可能是一个文本框控件)中。

receive_tb.AppendText(dataTemp.ToString());

这个语句会尝试调用dataTemp数组的ToString方法,但这不会将字节数组的内容转换为字符串。实际上,对于数组类型,ToString方法通常返回数组类型的名称以及元素的数量而不是数组内容的文本表示。例如,如果dataTemp是一个包含几个字节的数组,那么dataTemp.ToString()可能会返回类似于System.Byte[]这样的字符串,而不是字节的实际内容。

因此,这两个语句的效果完全不同。第一个语句会按照GB2312编码将字节转换为字符串并显示,而第二个语句只会显示数组的类型和大小信息,而不是数组的实际内容。

如果你想要以某种方式显示dataTemp的内容,你需要确保你以正确的方式将其转换为字符串。这通常涉及选择一个适当的编码来解码字节。如果你不确定数据的编码方式,你可能需要查看文档或询问数据的来源以确定正确的编码。如果你只是想以十六进制或其他格式显示字节,你需要编写额外的代码来实现这一点。

然后是怎么办

C#中,将字节数组转换为字符串通常取决于字节数组所代表的编码。如果字节数组包含的是文本数据,并且你知道它的编码方式(例如UTF-8ASCIIGB2312等),你可以使用Encoding类来将字节转换为字符串。以下是一些常见的转换方法:

使用UTF-8编码

byte[] dataTemp = ... // 你的字节数组  
string str = Encoding.UTF8.GetString(dataTemp);

使用ASCII编码

如果你的数据是ASCII文本:

byte[] dataTemp = ... // 你的字节数组  
string str = Encoding.ASCII.GetString(dataTemp);

使用其他编码

对于GB2312或其他编码,你可以这样做:

byte[] dataTemp = ... // 你的字节数组  
string str = Encoding.GetEncoding("GB2312").GetString(dataTemp);

未知编码

如果你不确定数据的编码,你可能需要尝试不同的编码,或者查看数据的文档或来源以确定正确的编码。

注意

如果字节数组包含非文本数据(例如图像、音频或二进制文件的一部分),那么将其转换为字符串可能没有意义,因为结果可能不是人类可读的。
在处理文本数据时,始终最好知道数据的编码,因为错误的编码会导致乱码或数据丢失。
在某些情况下,你可能需要处理字节顺序标记(BOM),这通常在UTF-16UTF-32编码的文本中出现。Encoding类通常能够处理这些情况,但了解这一点很重要,特别是当你处理来自不同来源的文本数据时。

异常处理
当处理字节到字符串的转换时,可能会出现异常,特别是当字节数组包含无效的编码序列时。为了避免程序崩溃,你可以使用try-catch块来捕获并处理这些异常:

byte[] dataTemp = ... // 你的字节数组  
string str;  
try  
{  str = Encoding.UTF8.GetString(dataTemp);  
}  
catch (DecoderFallbackException ex)  
{  // 处理解码异常,例如记录错误或提供默认值  str = "解码错误";  
}

在这个例子中,如果解码过程中发生异常,程序会捕获DecoderFallbackException异常,并给str赋一个默认值或采取其他适当的措施。

小demo

using System;class TODO
{public static void Main(string[] args){byte myByte = 0x10; // 二进制表示为 10100101  string str = myByte.ToString(); // 输出 "A5"Console.Write(str);}
}
16

下一个demo

//string str = Encoding.GetEncoding("GB2312").GetString(dataTemp);
//str = str.Replace("\0", "\\0");//0x00 \0 结束 不显示的,现在将他显示
//receive_tb.AppendText(str);foreach(byte i in dataTemp) {receive_tb.AppendText(Convert.ToChar(i).ToString());
}
//receive_tb.AppendText(dataTemp.ToString());//见博客字节数组

我也是闲的,将byte变成char再变成string输出

关于发送端的(发送新行)

foreach (byte i in dataTemp) {receive_tb.AppendText(Convert.ToString(i, 16));
}

关于为啥会在接收到我发送的内容后又接收到1310(都是10进制
这其实是换行和回车的ascii\r\n

手搓bug编码

之搓ascii encodeing

if (dataTemp.Length == 1) {receive_tb.AppendText(Convert.ToString(dataTemp[0], 16));} else if (dataTemp.Length == 2) {if (dataTemp[0] == 13 && dataTemp[1] == 10) {receive_tb.AppendText("\r\n");} else {receive_tb.AppendText(Convert.ToString(dataTemp[0], 16));receive_tb.AppendText(Convert.ToString(dataTemp[1], 16));}} else if (dataTemp.Length > 3) {for (int i = 0; i < dataTemp.Length - 2; i++) {receive_tb.AppendText(Convert.ToString(dataTemp[i], 16));}if (dataTemp[dataTemp.Length - 2] == 13 && dataTemp[dataTemp.Length - 1] == 10) {receive_tb.AppendText("\r\n");} else {receive_tb.AppendText(Convert.ToString(dataTemp[dataTemp.Length - 2], 16));receive_tb.AppendText(Convert.ToString(dataTemp[dataTemp.Length - 1], 16));}
} 

评价为不如BitConverter一根

string str = BitConverter.ToString(dataTemp).Replace("-", " ");
receive_tb.AppendText(str);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/784637.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux C++ 011-引用

Linux C 011-引用 本节关键字&#xff1a;Linux、C、引用 相关库函数&#xff1a; 基本的使用 作用&#xff1a;给变量起别名 语法&#xff1a;数据类型& 别名 原名; int a 10;int& b a;b 100; // 此时 a 100注意事项 引用必须初始化 引用在初始化后&#xf…

【网站项目】面向社区健康服务的医疗平台

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

【MATLAB源码-第25期】基于matlab的8QAM调制解调仿真,手动实现未调用内置函数,星座图展示。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 8QAM调制&#xff08;8 Quadrature Amplitude Modulation&#xff09;是一种数字调制技术&#xff0c;它可以在有限带宽内传输更多的信息比特。在8QAM调制中&#xff0c;每个符号可以携带3个比特的信息。QAM调制是将数字信号…

插入排序---算法

1、算法概念 插入排序&#xff1a;它的工作原理是通过构建有序排序&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置插入。 2、算法步骤 将第一待排序序列第一个元素看作一个有序序列&#xff0c;把第二个元素到最后一个元素当成是…

程序员开启网络创作之旅,分享一些真知灼见

我的口袋可能没那些高手那么鼓&#xff0c;不过呢&#xff0c;我更愿意站在一个副业新手的立场上&#xff0c;跟那些跟我差不多的伙计们分享点心得。咱们不指望一夜暴富&#xff0c;只希望能有个稳稳的小收入就心满意足了。 你看&#xff0c;那些在公众号上写出爆文的人&#…

内容营销新手指南:Kompas.ai的智能起步策略

内容营销是当今企业获取客户、建立品牌认知和忠诚度的关键手段。然而&#xff0c;对于刚刚踏入这一领域的新手来说&#xff0c;内容营销的世界可能会显得既广阔又复杂。从内容创作到发布&#xff0c;再到分析和优化&#xff0c;每一步都充满了挑战。本文旨在为内容营销新手提供…

分布式机房运维管理解决方案

一、引言 随着信息技术的快速发展和普及&#xff0c;各行各业对信息系统的依赖程度日益加深。信息系统的稳定运行和高效管理已成为确保业务连续性和降低运营成本的关键。本文旨在探讨一种全面的运维管理解决方案&#xff0c;以实现对分布式机房运行环境的有效监控和管理&#x…

selenium3 自动化测试入门 ~~~ 操作浏览器

前言 该教程适用于selenium 3版本&#xff0c;如果已经更新到selenium 4&#xff0c;启动浏览器的方法需要修改&#xff0c;具体可参考&#xff1a;selenium 4 启动浏览器 前置条件&#xff08;浏览器驱动放置位置&#xff09; 一、第一种方法 1.下载浏览器驱动 2.粘贴在pyt…

数据资产如何入表?有哪些步骤?

当下&#xff0c;数据资产入表这一关键环节对于企业的高效运营与决策制定具有至关重要的作用。软信天成团队经过长期研究与实践&#xff0c;将数据资产入表的全流程归纳总结为四个核心步骤&#xff0c;以期为诸位提供帮忙。 &#xff08;一&#xff09;确保数据合规&#xff0…

jvm(HotSpotVM)学习记录

1&#xff1a;当我们写的java文件经过编译器编译后生成class文件。class文件里面包含了各种java语言规范的特定语法。可以通过javap -v -private xxx.class 例如&#xff1a; javap -v -private Gas.class Classfile /D:/project/ike-springboot-carbonzero-v2/springboot-bms…

前端三剑客 —— CSS (第二节)

目录 内容回顾&#xff1a; CSS选择器*** 属性选择器 伪类选择器 1&#xff09;:link 超链接点击之前 2&#xff09;:visited 超链接点击之后 3&#xff09;:hover 鼠标悬停在某个标签上时 4&#xff09;:active 鼠标点击某个标签时&#xff0c;但没有松开 5&#xff09;:fo…

LabVIEW动车组谐波分析与检测系统

LabVIEW动车组谐波分析与检测系统 随着中国高速铁路网络的快速发展&#xff0c;动车组数量和运行速度的不断提升&#xff0c;其产生的谐波问题对电网产生了不小的影响。基于图形化编程语言LabVIEW&#xff0c;开发了一套动车组谐波分析与检测系统&#xff0c;旨在实时监控与分…

机器视觉/将HIK海康面阵相机连接Halcon软件

文章目录 概述工业相机客户端动态库拷贝Halcon连接HIK相机的配置相机参数其他 概述 本文简述了如何将海康面阵相机连接到Halcon软件中进行实时取图的过程。 补充&#xff0c; 整个实践过程使用 17.12 / x64-win64 Halcon 软件版本 海康 MV-CE200-10GM 面阵相机。从左到右简解…

B树、B+树、哈夫曼树

目录 1. B树2. B树3. 哈夫曼树 1. B树 特点&#xff1a;一个节点当中可以有多个值&#xff0c;节点内部key 值是有序的&#xff0c;节点内部存储的是key-value类型的数据 磁盘中文件存储用B树。 4阶B树一个节点最多三个key值 5阶B树一个节点最多四个key值 B树有很多的分支&…

华为OD机试 - 绘图机器 - 双指针(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…

Matlab中的脚本和函数

Matlab中的脚本和函数 文章目录 Matlab中的脚本和函数脚本创建脚本代码注释函数创建函数局部函数嵌套函数私有函数匿名函数补充知识函数句柄测试环境:Win11 + Matlab R2021a 脚本 ​ Matlab脚本是最简单的程序文件类型。它们可用于自动执行一系列 Matlab 命令,如命令行重复执…

复制初始化

#include <iostream> using namespace std;class Base { public:Base(const char* s) { str s; cout << "Base" << endl;}Base(const Base&) delete; private:const char* str; };int main() {Base d "123"; }上述代码直接将字符…

ROS2 学习(一)ROS2 简介与基本使用

参考引用 动手学 ROS2 1. ROS2 介绍与安装 1.1 ROS2 的历史 ROS&#xff08;Robot Operating System&#xff0c;机器人操作系统&#xff09;&#xff0c;但 ROS 本身并不是一个操作系统&#xff0c;而是可以安装在现在已有的操作系统上&#xff08;Linux、Windows、Mac&…

『VUE』07. v-for 的规范性:通过key管理状态 就地更新渲染策略(详细图文注释)

目录 vue渲染的就地更新策略一个例子说明key的必要性示例代码总结 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 如果你遇到了你的页面元素莫名其妙的呈现顺序,可能是你没有设置key. vue渲染的就地更新策略 在 Vue 中&#xff…

08、JS实现:数组两数之和算法的两种解决方案(一步一步剖析,很详细)

数组两数之和的算法 Ⅰ、数组两数之和算法的方案一&#xff1a;1、题目描述&#xff1a;2、解题思路&#xff1a;3、实现代码&#xff1a; Ⅱ、数组两数之和算法的方案二&#xff1a;1、实现代码&#xff1a; Ⅲ、小结&#xff1a; Ⅰ、数组两数之和算法的方案一&#xff1a; …