将字符数组转换为 ASCII 键值的快速方法

Fast Method of Converting Character Array to ASCII Key Value

本文关键字:方法 键值 ASCII 字符 数组 转换      更新时间:2023-10-16

我正在制作一个程序,该程序可以从由a-z和数字0组成的文件中按顺序读取大量字符。示例如下所示:

a0dgiw00cffn0ai0cbiwa0...

我相信我用这个序列将这个序列转换为字符数组:

strncpy(array, string.c_str(), sizeof(array));

现在我有一个数组,它应该看起来像这样:

[a][0][d][g][i][w][0][0]...

所以我的问题是,将字符数组中的所有值转换为 ASCII 键值的最有效方法是什么?在尽可能短的时间内提高效率。如果您不明白我所说的"ASCII 键值"是什么意思,最终数组应如下所示:

[97][48][100][103][105][119][48][48]...

旁注:可在此处找到 ASCII 键值表。

旁注:我已经知道如何将数组值转换为ASCII,我只是在寻找一种更快的方法。

提前谢谢你。

假设你的语言环境有很多东西,它已经存储为"引擎盖下"的ASCII字符,就像二进制中的'a'==97作为字符(或你的编译器/系统使用的任何内容)。 要让您的系统将"a"视为整数值而不是字符,您只需执行(int)'a',并将字符串的任何部分视为(int)array[index]

#include <iostream>
#include <string>
int main() {
    using namespace std;
    string sample = "abcdefghijklmnopqrstuvwxyz";
    for(char c : sample) {
        // NOTE: cast to (int) doesn't change value of 'c'.
        cout << c << '=' << (int)c << endl;
    }
    return 0;
}

输出:

a=97
b=98
c=99
d=100
e=101
f=102
g=103
h=104
i=105
j=106
k=107
l=108
m=109
n=110
o=111
p=112
q=113
r=114
s=115
t=116
u=117
v=118
w=119
x=120
y=121
z=122

对于初学者来说,如果您正在寻找效率,那么对数组的初始strncpy()绝对不会完成任何事情。我不明白它能给你带来什么。 string.c_str()为您提供与阵列完全相同的const char *。保持一切就绪,避免不必要的复制开销。

然后,如果您正在寻找将char值转换为十进制的最有效方法,那么手动执行此操作将很难被击败。

unsigned char c=  /* wherever you get the next char from */
int zero=0;
if (c >= 100)
{
    zero=1;
    *ptr++ = (c/100) + '0';
    c = c % 100;
}
if (c >= 10 || zero)
{
    *ptr++ = (c / 10) + '0';
}
*ptr++ = (c % 10) + '0';

这应该很容易击败std::ostream的功能,因为它不必担心std::ostream输出格式必须做的所有包袱。

现在,如果原始string的长度为 n=size() 个字节,则转换为十进制表示的整个事物的最长可能大小是每个值三个字符,即 n*3 。然后,考虑到括号,它又是两个,总共 n*5 .

所以:

 std::vector<char> output_buffer;
 output_buffer.resize(string.size()*5);
 auto ptr=&output_buffer[0];
 for (unsigned char c:string)
 {
       // the code segment above, with a few extra bits to append
       // the [ and the ], in the right place.
 }

完成后,ptr-&output_buffer[0]会为您提供实际写入的字符数。您可以修剪缓冲区,或将其复制到您自己的std::string中,这是您的选择。