Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在C#中使用ASCII字符编码将字符串转换为byte[]数组的最快方法(性能方面)

在C#中使用ASCII字符编码将字符串转换为byte[]数组的最快方法(性能方面)
EN

Stack Overflow用户
提问于 2009-08-26 22:30:57
回答 8查看 10.1K关注 0票数 9

在C#中将字符串转换为byte[]数组的最快方法是什么?我正在通过套接字发送大量的字符串数据,并且需要优化每个操作。目前,我使用以下命令将字符串转换为byte[]数组:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private static readonly Encoding encoding = new ASCIIEncoding();
//...
byte[] bytes = encoding.GetBytes(someString);
socket.Send(bytes);
//...
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-08-26 14:47:13

如果你所有的数据都是ASCII码,那么你可以比ASCIIEncoding稍微快一点,它有各种(完全合理的)位错误处理等。你也可以通过避免总是创建新的字节数组来加快速度。假设你有一个上限,你所有的消息都在这个上限下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void QuickAndDirtyAsciiEncode(string chars, byte[] buffer)
{
    int length = chars.Length;
    for (int i = 0; i < length; i++)
    {
        buffer[i] = (byte) (chars[i] & 0x7f);
    }
}

然后你会做一些类似这样的事情:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
readonly byte[] Buffer = new byte[8192]; // Reuse this repeatedly
...
QuickAndDirtyAsciiEncode(text, Buffer);
// We know ASCII takes one byte per character
socket.Send(Buffer, text.Length, SocketFlags.None);

然而,这是一个非常绝望的优化。我会坚持使用ASCIIEncoding,直到我证明这是瓶颈(或者至少这种糟糕的黑客攻击没有帮助)。

票数 16
EN

Stack Overflow用户

发布于 2009-08-26 14:34:09

我要说的是,你现在的做法已经足够好了。如果你真的关心像那样的低级优化,我能做的最好的建议是获取Reflector。使用reflector,您可以自己查看代码(大多数时候),并了解算法是什么。如果reflector没有显示,您可以随时下载Microsofts (共享源代码公共语言基础架构)来查看MethodImplOptions.InternalCall方法背后的C++代码。

以下是Encoding.ASCII.GetBytes的实际实现,以供参考:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public override int GetBytes(string chars, int charIndex, int charCount, byte[] bytes, int byteIndex)
{
    if ((chars == null) || (bytes == null))
    {
        throw new ArgumentNullException();
    }
    if ((charIndex < 0) || (charCount < 0))
    {
        throw new ArgumentOutOfRangeException();
    }
    if ((chars.Length - charIndex) < charCount)
    {
        throw new ArgumentOutOfRangeException();
    }
    if ((byteIndex < 0) || (byteIndex > bytes.Length))
    {
        throw new ArgumentOutOfRangeException();
    }
    if ((bytes.Length - byteIndex) < charCount)
    {
        throw new ArgumentException();
    }
    int num = charIndex + charCount;
    while (charIndex < num)
    {
        char ch = chars[charIndex++];
        if (ch >= '\x0080')
        {
            ch = '?';
        }
        bytes[byteIndex++] = (byte) ch;
    }
    return charCount;
}
票数 9
EN

Stack Overflow用户

发布于 2009-08-26 14:34:23

我想GetBytes()函数已经为此进行了很好的优化。我想不出任何建议来提高您现有代码的速度。

编辑--你知道,我不知道这是不是更快。但这里有另一种使用BinaryFormatter的方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
bf.Serialize(ms, someString);
byte[] bytes =  ms.ToArray();
ms.Close();
socket.Send(bytes);

我认为这可能更快的原因是它跳过了编码步骤。我也不能完全确定这是否能正常工作。但是你可以试一试,看看。当然,如果你需要ascii编码,这是没有用的。

我只是有了另一个想法。我相信这段代码返回的字节数是使用ASCII码的GetBytes的两倍。原因是.NET中的所有字符串都在幕后使用unicode。当然,Unicode每个字符使用2个字节,而ASCII只使用1个字节,所以在这种情况下可能不使用BinaryFormatter,因为这样会使通过套接字发送的数据量加倍。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1337895

复制
相关文章
LearnPython - Zip格式文
1 import zipfile 2 import os 3 4 5 def unzip(zip_name, target_dir): 6 files = zipfile.ZipFile(zip_name) 7 for zip_file in files.namelist(): 8 files.extract(zip_file, target_dir) 9 10 11 def main(): 12 zip_name = r'./image.z
py3study
2020/02/10
3230
WordPress 技巧:给留言序号添加前导零
默认情况下,留言的序号是 1,2,3,4 ... 11 这样排下去,如果你想让所有的留言序号位数一样,给它们添加前导零,做成类似:01,02,03,04 ... 11 这样的序号,我们怎么处理呢?
Denis
2023/04/15
4920
zip文件后缀改成什么可以用_zip格式转rar格式
案例2,批量修改文件扩展名\后缀名 1 上面介绍的是只修改某一类的后缀名,那么如果我整个文件夹下面的所有类型的文件都要修改怎么办呢?如下图 什么类型的文件都有呢
全栈程序员站长
2022/11/04
1.4K0
将ZIP文件添加到程序集资源文件然后在运行时解压文件
今天做安装打包程序研究,之前同事将很多零散的文件发布成一个安装文件夹给用户,这样体验不好,我希望将所有文件打包成一个.net程序,运行此程序的时候自解压然后执行后续的安装步骤。 解决过程: 1,将所有零散文件使用WinRAR工具,打包成一个ZIP格式文件,比如 SetupRes.zip 2,新建一个控制台或者WinForms程序项目作为“打包项目”; 3,将SetupRes.zip文件放到打包程序项目的根目录下面,选择此文件,属性-》嵌入的资源; 4,添加如下代码: class Program {
用户1177503
2018/02/26
1.4K0
[MySQL] mysql int后面的数字与前导零填充
1.int或者tinyint等数值型字段的存储范围已经是固定的,和类型相关 2.后面的数字只与显示有关,并且是在开启了zerofill前导零填充的前提下
唯一Chat
2019/09/10
1.5K0
[MySQL] mysql int后面的数字与前导零填充
zip格式转化成String
</pre><pre name="code" class="java"><pre name="code" class="java"><pre name="code" class="java">public static StringBuffer readZipFile(File file) throws Exception { StringBuffer html = new StringBuffer(); ZipFile zf = new ZipFile(file); Enumerat
用户5166556
2019/04/16
1K0
浅谈zip格式处理逻辑漏洞
前言:zip压缩格式应用广泛,各个平台都有使用,Windows平台使用来压缩文件,Android平台使用来作为apk文件的格式。由于zip文件格式比较复杂,在解析zip文件格式时,如果处理不当,可能导致一些有意思的逻辑漏洞,本篇文章将挑选有意思的漏洞进行解析。 一、文件扩展名欺骗漏洞 很早之前,国外安全研究人员爆料Winrar 4.x版本存在文件扩展名欺骗漏洞(https://www.exploit-db.com/papers/32480/),黑客可以通过该漏洞诱骗受害者执行恶意程序。该漏洞的主要原理是:W
逸鹏
2018/04/09
1.6K0
浅谈zip格式处理逻辑漏洞
Linux压缩和解压zip格式的文件
zip 格式文件是 Windows 和 Linux 系统都通用的压缩文件类型,属于几种主流的压缩格式(zip、rar等)之一,是一种相当简单的分别压缩每个文件的存储格式。
技术训练营
2019/12/18
7K0
POJ 3252 Round Numbers(数位dp+前导零)
       思路就是我们将它的二进制存起来,然后这里需要判断前导零的情况,不是很难理解,以dp[pos][n0][n1]分别来存第pos位,0的个数,1的个数,然后记忆化搜索就好了。
Ch_Zaqdt
2019/01/28
5740
Linux解压zip格式压缩包
将当前目录下的1.txt压缩为1.zip。选项-q表示忽略执行过程,-r表示递归处理,将指定目录下的所有文件和子目录一并处理
全栈程序员站长
2022/08/25
4.6K0
将Sublime添加到鼠标右键
2、找到 HKEY_CLASSES_ROOT/*/shell 目录,在此目录下操作。
新码农
2020/03/05
3K0
解决将Editplus添加到鼠标右键的问题
以管理员身份运行EditPlus 一次点击–>工具–>首选项–>常规–>勾选将EditPlus添加到系统右键菜单选项
别团等shy哥发育
2023/02/25
1.4K0
解决将Editplus添加到鼠标右键的问题
将Windows Terminal添加到鼠标右键
导读 非常实用的小技巧。 下载Windows Terminal图标,右键另存为。 [WindowsTerminal图标] 保存至'C:\Users\Administrator\AppData\Local\Terminal\Terminal.ico'。 win+R输入'regedit',打开注册表。 找到'HKEY_CLASSES_ROOT\Directory\Background\shell'目录,在此目录下操作。 新建项'wt',双击右边'默认',更改右键文字显示内容'Windows Terminal H
新码农
2020/08/05
3.6K0
将Windows Terminal添加到鼠标右键
NodeJs前导课
NodeJs前导课 了解后端 后端分层 node的思想 具有模块化 了解后端 后端分层 web层 接收和发送Http请求,还需要校验参数是否合法,将参数封装成对象,也可以成为web层,controller层 业务逻辑层 xxxService,也称为服务成,处理业务逻辑 DAO层 DB,存取数据 持久层 文件,数据库 这里的数据库有两种,一种是关系型数据库(Msql),还有一种是非关系型数据库(MongoDB) node的思想 具有模块化 需要require和 module.exports 在前
envoke
2020/09/17
2880
【Android 逆向】APK 文件格式 ( Android 应用安装 | Zip 文件格式 | 使用 Python 代码提取 APK 文件 )
APK 是 Android 应用的安装文件 , 现在也有 AAB 格式的 , AAB 安装包也可以导出 APK 安装文件 ;
韩曙亮
2023/03/29
1.3K0
【Android 逆向】APK 文件格式 ( Android 应用安装 | Zip 文件格式 | 使用 Python 代码提取 APK 文件 )
Windows 下 MariaDB10.2.17 (zip 格式) 的安装教程
下载地址:https://downloads.mariadb.org/ 然后根据系统选择x86(32位)或x64(64位)版本的zip格式的安装包
全栈程序员站长
2022/08/25
1.1K0
将Emoji表情添加到项目中 顶
选择完需要的表情,点击消息预览就可以看到效果了,有一个微笑表情是QQ表情~~ 可以不用管它。
linapex
2019/03/26
1.8K0
将Emoji表情添加到项目中
                                                    顶
dart - 将 orElse 函数添加到 firstWhere 方法
我正在尝试将 onElse 函数添加到 iterator.firstWhere 方法,但我无法获得正确的语法。 我试过类似的东西
徐建国
2021/08/31
1.6K0
python缩进格式错误的是_python 缩进错误,
要求严2113格的代码缩进是python语法的一大特色,就像C语言5261家族(C、C++、Java、C#等等)中的花括4102号一1653样重要,在大多数场合还有必要。在很多代码规范里面也都有要求代码书写按照一定的规则进行换行和代码缩进,但是这些要求只是纯粹是方便人(程序员)来阅读、使用或修改的,对于编译器或者解释器而言,完全是视而不见的。但是对Python解释器而言,每行代码前的缩进都有语法和逻辑上的意义。Python的这个特性,也经常在Python使用者和非Python使用者中引起争论。
全栈程序员站长
2022/07/28
2.2K0
将程序添加到右键菜单快速启动
打开注册表编辑器:按下 Win + R 键,输入 regedit,然后按回车键打开注册表编辑器。
浪漫主义狗
2023/09/04
4480
将程序添加到右键菜单快速启动

相似问题

将前导零添加到数字

40

将前导零添加到日期

13

将前导零添加到Oracle编号

10

将前导零添加到列中

13

Javascript将前导零添加到日期

3013
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文