V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
rizon
V2EX  ›  程序员

String(byte bytes[], int offset, int length)为什么字节转字符串时需要偏移量和长度?

  •  
  •   rizon ·
    othorizon · 2019-06-10 16:51:02 +08:00 · 1651 次点击
    这是一个创建于 901 天前的主题,其中的信息可能已经有所发展或是发生改变。

    字节转字符串时,为什么会有偏移量这种东西?
    偏移之后这一组的字节剩下的东西是什么东西呢?? 哪来的呢?干什么用的呢??

    比如在读文件流时,或者读屏幕输入时,为什么会有一些不需要的信息?他们是给谁用的? 为啥不直接过滤掉?

    10 条回复    2019-06-10 23:51:41 +08:00
    feiyuanqiu
        1
    feiyuanqiu   2019-06-10 17:05:59 +08:00
    因为这是给需要从字节数组里取一部分出来构造字符串的场景提供的,你完全可以用另一个构造函数:

    public String(byte bytes[]) {
    this(bytes, 0, bytes.length);
    }
    akira
        2
    akira   2019-06-10 17:09:48 +08:00
    你需要的字符串 并不总是会从头开始的 需要根据实际情况来读取对应的结构
    rizon
        3
    rizon   2019-06-10 17:15:20 +08:00
    @feiyuanqiu #1
    @akira #2
    我想问的就是那些不需要的部分是怎么来的?
    rizon
        4
    rizon   2019-06-10 17:15:46 +08:00
    专门为这个提供一个 offset 的概念,而不是让用户自己分割好之后在传进来,而且在流读取的时候也需要用这个。
    说明偏移量是一个较底层的原因产生的东西,我想知道的就是他是怎么产生的,是由于计算机的什么导致的?比如是因为 CPU ?
    lff0305
        5
    lff0305   2019-06-10 17:46:58 +08:00
    比如你读文件要略过若干个字节的头部(比如 BOM )
    更多的情况是你从网络读了一些 byte 过来,要略过头尾
    littleylv
        6
    littleylv   2019-06-10 17:58:34 +08:00
    这种情况非常正常好不好,很多交互信息带了头(例如标志这条信息是什么东西)尾(例如校验位)
    pmispig
        7
    pmispig   2019-06-10 18:07:00 +08:00
    我感觉这个方法多此一举,我自己会切割好再转。
    ArthurRen
        8
    ArthurRen   2019-06-10 18:09:54 +08:00 via Android
    楼上这么做会增加内存开销啊
    pursuer
        9
    pursuer   2019-06-10 18:16:58 +08:00
    @rizon 如果你说的是 Java,用户分割的时候会需要一次内存拷贝,生成 String 的时候需要拷贝一次,加上 offset 就可以只拷贝一次了
    C++的 string 就直接传入的 char*,因为用户可以移动 char*指针不需要复制子串
    rizon
        10
    rizon   2019-06-10 23:51:41 +08:00
    @littleylv #6
    @pursuer #9
    ok 明白了
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2213 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 15:24 · PVG 23:24 · LAX 07:24 · JFK 10:24
    ♥ Do have faith in what you're doing.