比较 文本数据 和 二进制数据

       文本数据和二进制数据是前端数据处理两种常见的数据类型。文本数据通常用于展示人类可读的信息,而二进制数据则用于在计算机内部存储和处理信息。这两种数据类型在表示和处理方式上存在一定的异同。

不同点:

  1. 文本数据是由字符组成的数据,可以直接显示和编辑,而二进制数据是由0和1组成的数据,需要通过特定的编码方式进行解析。
  2. 文本数据通常用于表示文本信息,如文字、数字等,而二进制数据通常用于表示图像、音频、视频等非文本信息。

相同点:

  1. 文本数据和二进制数据都可以用来存储和传输信息。
  2. 在计算机中,文本数据和二进制数据都是以二进制形式存储的。

注意事项:

  1. 在处理文本数据时,需要考虑字符编码的问题,如UTF-8、GBK等。字符编码是将字符转换为计算机能够识别和处理的二进制数据的过程,不同的字符编码方式会影响文本数据的存储、传输和显示。因此在处理文本数据时,需要确保选择正确的字符编码方式以避免出现乱码数据损坏的情况。下面这个例子就会出现乱码的现象,因为以GBK编码方式读取UTF-8编码的文本文件,导致无法正确解码文本内容。
    # 写入一个UTF-8编码的文本文件
    with open('text.txt', 'w', encoding='utf-8') as file:
        file.write('你好,世界!')
    
    # 以GBK编码方式读取该文件,导致乱码
    with open('text.txt', 'r', encoding='gbk') as file:
        content = file.read()
        print(content)
    
    #下面这样读取就不会乱码
    with open('text.txt', 'r', encoding='utf-8') as file:
        content = file.read()
        print(content)
  2. 在处理二进制数据时,需要了解数据的结构和格式,以正确解析数据。
  3. 在数据传输和存储过程中,需要确保数据的完整性和安全性。

使用JavaScript进行相互转化的方法:

  • 文本转换为二进制数据:
    // 方法一:使用TextEncoder将文本转换为Uint8Array 
    //适用于:需要对二进制数据进行处理或传输的场景
    const text = "Hello, world!";
    const encoder = new TextEncoder();
    const binaryData = encoder.encode(text);
    
    // 方法二:使用Blob对象创建二进制数据
    //适用于:需要将二进制数据作为文件进行下载或上传的场景
    const binaryDataBlob = new Blob([text]);
    
    // 方法三:使用ArrayBuffer将文本转换为二进制数据
    //适用于:需要直接操作二进制数据的场景
    const buffer = new ArrayBuffer(text.length);
    const view = new Uint8Array(buffer);
    for (let i = 0; i < text.length; i++) {
      view[i] = text.charCodeAt(i);
    }
  • 二进制数据转换为文本:
    // 方法一:使用TextDecoder将二进制数据转换为文本
    //适用于:例如从服务器获取的二进制数据需要解码为文本
    const decoder = new TextDecoder();
    const decodedText = decoder.decode(binaryData);
    
    // 方法二:使用FileReader读取二进制数据并转换为文本
    //适用于:例如读取本地文件或通过网络获取的二进制数据
    const reader = new FileReader();
    reader.onload = function(event) {
      const text = event.target.result;
      console.log(text);
    };
    reader.readAsText(binaryDataBlob);
    
    // 方法三:使用TypedArray将二进制数据转换为文本
    //适用于:需要直接操作二进制数据的场景
    const textArray = Array.from(new Uint8Array(binaryData));
    const textFromBinary = String.fromCharCode(...textArray);

  • 16
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Netty是一个基于NIO的网络框架,可以轻松实现WebSocket协议,同时支持发送文本二进制数据。 以下是一个简单的Netty实现WebSocket发送文本二进制数据的示例代码: ```java public class WebSocketServerHandler extends SimpleChannelInboundHandler<Object> { private WebSocketServerHandshaker handshaker; @Override public void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception { if (msg instanceof FullHttpRequest) { // 处理HTTP请求,WebSocket握手请求 handleHttpRequest(ctx, (FullHttpRequest) msg); } else if (msg instanceof WebSocketFrame) { // 处理WebSocket请求,包括文本二进制数据 handleWebSocketFrame(ctx, (WebSocketFrame) msg); } } private void handleHttpRequest(ChannelHandlerContext ctx, FullHttpRequest req) throws Exception { // 如果HTTP解码失败,返回HTTP异常 if (!req.decoderResult().isSuccess() || !"websocket".equals(req.headers().get("Upgrade"))) { sendHttpResponse(ctx, req, new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.BAD_REQUEST)); return; } // 握手请求 WebSocketServerHandshakerFactory wsFactory = new WebSocketServerHandshakerFactory("ws://localhost:8080/ws", null, false); handshaker = wsFactory.newHandshaker(req); if (handshaker == null) { WebSocketServerHandshakerFactory.sendUnsupportedVersionResponse(ctx.channel()); } else { handshaker.handshake(ctx.channel(), req); } } private void handleWebSocketFrame(ChannelHandlerContext ctx, WebSocketFrame frame) throws Exception { // 判断是否是关闭链路的指令 if (frame instanceof CloseWebSocketFrame) { handshaker.close(ctx.channel(), (CloseWebSocketFrame) frame.retain()); return; } // 判断是否是Ping消息 if (frame instanceof PingWebSocketFrame) { ctx.channel().write(new PongWebSocketFrame(frame.content().retain())); return; } // 判断是否是二进制消息 if (frame instanceof BinaryWebSocketFrame) { // 处理二进制消息 ByteBuf binaryData = frame.content(); // TODO: 处理二进制数据 return; } // 处理文本消息 if (frame instanceof TextWebSocketFrame) { String text = ((TextWebSocketFrame) frame).text(); // TODO: 处理文本数据 return; } } private static void sendHttpResponse(ChannelHandlerContext ctx, FullHttpRequest req, FullHttpResponse res) { // 返回HTTP响应 if (res.status().code() != 200) { ByteBuf buf = Unpooled.copiedBuffer(res.status().toString(), CharsetUtil.UTF_8); res.content().writeBytes(buf); buf.release(); HttpHeaderUtil.setContentLength(res, res.content().readableBytes()); } // 如果不是Keep-Alive,关闭连接 boolean keepAlive = HttpHeaderUtil.isKeepAlive(req); if (!keepAlive) { ctx.writeAndFlush(res).addListener(ChannelFutureListener.CLOSE); } else { res.headers().set(HttpHeaderNames.CONNECTION, HttpHeaderValues.KEEP_ALIVE); ctx.writeAndFlush(res); } } } ``` 在以上示例代码中,`handleHttpRequest()` 方法负责处理HTTP请求,进行WebSocket握手,并将 WebSocketServerHandshaker 对象保存起来。`handleWebSocketFrame()` 方法则负责处理WebSocket请求,包括文本二进制数据。根据不同的 WebSocketFrame 类型,分别进行处理即可。在处理二进制数据时,可以通过 ByteBuf 对象来获取数据

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值