Java 和 Go 中的 byte 和 String 转换

背景

在讨论 Java 和 Go 中的 byteString 之间的转换时,需要理解它们对字符串和字节数组的不同处理方式,尤其是对于编码和解码的策略。让我们深入探讨 Java 和 Go 在处理这些转换时的设计和实现。

Java 中的 byte[]String 转换:

  1. Java 字符串的存储和编码:

    • 在 Java 中,String 类本质上是用来存储字符序列的,它内部使用 UTF-16 编码。
    • byte[] 是原始的字节数据序列,不包含任何字符语义。
  2. 默认字符集:

    • Java 提供了 String(byte[]) 构造方法,这会尝试使用默认字符集将 byte[] 转换为 String
    • 如果默认字符集是 UTF-8,它会尝试将字节序列解码为字符。如果字节序列不是有效的 UTF-8 字符序列,则会出现解码错误。
    • 对于解码错误的处理,Java 使用替代字符 '\uFFFD'(通常被称为 REPLACEMENT CHARACTER)来表示解码失败的字节序列。
  3. 指定字符集:

    • 可以通过 new String(byte[], Charset) 构造方法明确指定字符集来进行解码,这样可以控制如何解释字节数据。
    • 例如,使用 ISO-8859-1 这样的单字节字符集时,每个字节直接映射为一个字符,因此不会有替换问题。
  4. 解码错误的处理:

    • Java 中使用的解码器(如 UTF-8 解码器)在遇到非法的字节序列时,会根据编码器的设置(CodingErrorAction.REPLACE)将其替换为 '\uFFFD'
    • 这种替换是为了保持解码过程的连贯性,避免抛出异常。

Go 中的 bytestring 转换:

  1. Go 字符串的存储和编码:

    • 在 Go 中,string 是一个 UTF-8 编码的字节序列。Go 的 string 类型设计上是一个不可变的字节序列视图。
    • []byte 是一个字节切片,可以存储任意的字节数据。
  2. 直接转换:

    • 在 Go 中,将 []byte 转换为 string 是一个直接的操作。Go 语言不会对字节序列进行任何解码或者检查。
    • 即使字节序列不构成有效的 UTF-8 编码字符,转换也不会失败,结果是一个包含这些原始字节的 string
  3. 不进行替换:

    • Go 中 []bytestring 的转换直接将字节视为字符串的字节序列,即使这些字节在 UTF-8 编码中是无效的。
    • 因此,没有字符被替换为 '\uFFFD',转换结果是一个包含原始字节的 string

设计上的差异:

  1. 字符串的设计目的:

    • Java 中的 String 主要是为了表示文本,通常与字符集和编码有关。它使用 UTF-16 来存储字符序列,考虑到了多种语言的字符表示。
    • Go 的 string 是一个不可变的字节序列,尽管它通常表示 UTF-8 编码的文本,但其底层是一个字节数组。
  2. 编码和解码的策略:

    • Java 设计上对字符编码和解码更加严格,特别是在处理国际化和多语言文本时。这使得它在处理 byte[]String 时必须进行编码检查和处理。
    • Go 更关注字节数据的直接处理,它的 string 类型更像是一个只读的 []byte,因此在转换时更倾向于直接处理而不检查或更改字节内容。
  3. 默认行为:

    • Java 假设用户希望 byte[] 转换为有效的字符序列,因此需要处理不合法的字节(通过替换或者抛出异常)。
    • Go 假设用户知道字节数据的内容,并且不对其进行额外的处理,因此允许不合法的 UTF-8 字节直接转为 string

代码示例与对比:

Java 代码示例:

import java.nio.charset.StandardCharsets;
import java.util.Arrays;public class ByteToStringExample {public static void main(String[] args) {byte[] bytes = new byte[] {(byte) 0xef, (byte) 0x8f, (byte) 0xff};// 使用默认字符集转换 (假设为 UTF-8)String strDefaultCharset = new String(bytes);System.out.println("String (default charset): " + strDefaultCharset);System.out.println("Bytes (default charset): " + Arrays.toString(strDefaultCharset.getBytes()));// 使用 ISO-8859-1 转换String strISO = new String(bytes, StandardCharsets.ISO_8859_1);System.out.println("String (ISO-8859-1): " + strISO);System.out.println("Bytes (ISO-8859-1): " + Arrays.toString(strISO.getBytes(StandardCharsets.ISO_8859_1)));}
}

Go 代码示例:

package mainimport ("fmt""reflect"
)func main() {bytes := []byte{0xef, 0x8f, 0xff}// 直接将 []byte 转换为 stringstr := string(bytes)fmt.Println("String: ", str)fmt.Println("Bytes: ", []byte(str))// 检查原始字节和转换后的字节是否相同fmt.Println("Are equal: ", reflect.DeepEqual(bytes, []byte(str)))
}

总结:

  • Java: 强调对字符集和编码的处理,String 是用来表示文本的类,在转换时需要处理不合法的字节。
  • Go: string 是不可变的字节序列视图,直接允许 []byte 转换为 string,无论字节是否构成有效的 UTF-8 字符。

如果在 Java 中不希望进行替换错误编码的处理,而希望直接存储字节数据,应当选择直接使用 byte[] 而不是 String。这样可以避免编码和解码过程中的问题。

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

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

相关文章

MQTTfx连接阿里云(详细版)

1、介绍 作为物联网开放平台,阿里云可谓是吸引大多数嵌入式爱好者的平台。物联网MQTT协议火热的今天,你使用过阿里云吗?本篇文章带你接触阿里云,实现MQTT通信。 我们在测试MQTT之前先了解下什么是MQTT协议。大家都知道它是一种发…

STM32之二:时钟树

目录 1. 时钟 2. STM3时钟源(哪些可以作为时钟信号) 2.1 HSE时钟 2.1.1 高速外部时钟信号(HSE)来源 2.1.2 HSE外部晶体电路配置 2.2 HSI时钟 2.3 PLL时钟 2.4 LSE时钟 2.5 LSI时钟 3. STM32时钟(哪些系统使用时…

css-Echarts图表柱状图,X轴横坐标值显示不完全问题

1.问题 在Echarts图表中当横坐标数值过多,或者数值过长时会导致部分横坐标不显示。数据量少或简单会默认显示完全,当放大时会导致部分横坐标隐藏。 更改第一个Mon字段名 会发现偶数横坐标显示隐藏; 2.解决方法 2.1 在x横坐标中添加interval…

Autosar Dcm配置-0x23服务ReadMemoryByAddress-基于ETAS软件

文章目录 前言Dcm配置DcmDsdDcmDspDcmDspMemoryIdInfo 代码分析总结 前言 一般在调教开发阶段,会使用XCP进行观测和标定,本质上也是操作指定的内存地址。量产后,一般XCP会取消。本文介绍的UDS ReadMemoryByAddress服务,也是读取内…

关于jupyter notebook的使用经验

jupyter notebook 第一点,调整每次打开jupyter notebook的时候的位置第二点,如何设置jupyter notebook可以使用本地anaconda创建的虚拟环境呢?第三点,使用jupyter notebook的技巧 以下三点都是独立的,可以根据自己的需…

SHA256 安全散列算法加速器实验

1、SHA256 介绍 SHA256 加速器是用来计算 SHA-256 的计算单元, SHA256 是 SHA-2 下细分出的一种算法。 SHA-2 名称来自于安全散列算法 2 (英语: Secure Hash Algorithm 2 )的缩写,一种密码散列函 数算法标准…

zdppy_docserver结合zdpvue_client开发前后端分离的文档管理系统

创建前端应用 pnpm create vite安装依赖 pnpm add onlyoffice/document-editor-vue基本使用 这里有三个非常关键的URL地址: 文档服务地址:http://192.168.101.5:8080文档地址:http://192.168.101.5:18889/test.docx回调地址:h…

AI与音乐:创新之光还是毁灭之剑?

AI与音乐:创新之光还是毁灭之剑? 在数字时代的浪潮中,人工智能(AI)技术正以前所未有的速度渗透到音乐领域,引发了广泛的讨论和争议。本文将探讨AI与音乐之间的关系,分析它是否带来了音乐创新的…

用Rancher2.8.5部署K8s集群

参考:通过Rancher 2.7.5部署企业生产级K8s集群 新K8s集群的环境信息 Rancher1台,K8s集群6台(1台rancher,3台master,4台node)。 Name|lmage Name|IP Address|Flavor|Comment project-root-dev-rancher|Ro…

Stable Diffusion 3 如何下载安装使用及性能优化

Stable Diffusion 3 Stable Diffusion 3(SD3),Stability AI最新推出的Stable Diffusion模型系列,现在可以在Hugging Face Hub上使用,并且可以与Diffusers一起使用。 今天发布的模型是Stable Diffusion 3 Medium&…

万字详解ANSI SQL语法及其扩展

ANSI SQL 与扩展SQL详解 一、ANSI SQL语法 ANSI SQL(American National Standards Institute Structured Query Language),即美国国家标准学会结构化查询语言,是一种标准化的数据库查询语言。它用于管理和操作关系数据库中的数据…

【数学】Leetcode 66. 加一【简单】

加一 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外,这个整数不会以零开头。 示例 1: 输入:…

在Krpano中点击热点放大图片并交互

在全景项目中,经常会遇到这样的功能:点击场景中的某个热点,能够进行图片放大,同时还可以对图片进行交互操作,比如放大图片、拖动图片等,本章节内容讲述如何在Krpano库中调用js代码实现图片的放大和交互。具…

MySQL入门学习-连接查询.RIGHT JOIN

Rights Join 是 MySQL 中的一种连接查询类型,用于根据右表中的匹配条件,将左表中的数据与右表中的数据进行连接。 一、与其他连接查询相比,Rights Join 具有以下特点: 1. 连接方向: Rights Join 以右表为主表&#x…

django 身份验证与鉴权

目录 用户模型建立账号密码登录手机号登录验证码双后端鉴权JWT 介绍 用户模型建立 在django中自带auth_user表,字段名有id, password,username,is_superuer,is_activate , email ,is_staff(用于标识某个用户是否可以登录到 Django 的管理界面…

【Sa-Token|2】Sa-Token在微服务中的使用

在微服务架构中,使用 Sa-Token 进行分布式认证和权限管理需要考虑到各个服务之间的通信和 Token 的共享。以下是一个详细的教程,介绍如何在微服务中使用 Sa-Token。 1. 微服务架构介绍 假设有以下几个微服务: AuthService: 负责用户认证和 …

Python-日志模块

目录 一、日志级别 二、日志配置 1、日志基本配置 2、日志配置字典(知道咋么改就可以) 3、日志的使用 一、日志级别 import logginglogging.debug(调试日志) logging.info(消息日志) logging.warning(警告日志) logging.error(错误日志) logging.cr…

Java自增自减运算符

Java中的自增自减运算符分为两种: 自增运算符“ ”,作用是执行加法运算的变量值1 自减运算符“ -- ”,作用是执行加法运算的变量值-1 注意事项: “ ”和“ -- ”既可以放在变量的前面,也可以放在变量的后面。 自增自…

Linux驱动开发笔记(十三)Sysfs文件系统

文章目录 前言一、Sysfs1.1 Sysfs的引入1.2 Sysfs的目录结构1.2 Sysfs的目录详解1.2.1 devices1.2.2 bus1.2.3 class1.2.4 devices、bus、class目录之间的关系1.2.5 其他子目录 二、Sysfs使用2.1 核心数据结构2.2 相关函数2.2.1 kobject_create_and_add2.2.2 kobject_put()2.2.…

大模型自然语言生成自动驾驶可编辑仿真场景(其一 共十篇)

第一篇:LLM greater scene summarize 第二篇:LLM simulation Test effect 第三篇:LLM simulation driving scenario flow work 第四篇:LLM Algorithm flow description 第五篇:Configure the environment and back…