将字符数组转换为 ASCII 键值的快速方法
Fast Method of Converting Character Array to ASCII Key Value
我正在制作一个程序,该程序可以从由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
中,这是您的选择。
- 使用一个考虑到std::map中键值的滚动或换行的键
- 如何使用 std::variant 打印地图键/值?
- 当键值是 std 向量时,为什么使用 at in C++ 访问映射值如此缓慢?
- C++ 映射的键/值的用户自定义名称?
- 试图(稍微)概括C++模板.关联容器键:值反转
- 更改多重映射容器中所有元素的键值
- 如何使用C++和Boost Asio从HTTP发布请求中获取键值
- 插入新键时,它会更改现有键值的地址吗?
- 在C++中共享键值对的最佳方式
- 使用无序映射在STL中存储键值对
- c++同一个键的多个键/值对
- 如何优化C++键值程序以获得更快的运行时间
- C++中的键值对:<val1, val2> 键<frequency>与值一样
- 在结构的构造函数中使用类方法赋值变量
- 在 std::unordered_map 中插入新的键/值对会导致"out of range"异常
- 如何将 JSON 键值(我使用 cpp boost 解析)存储在相关数据结构中?
- 检索16k键值对的最快方法
- 同时对两个向量(键/值)进行排序的最快方法
- 将字符数组转换为 ASCII 键值的快速方法
- 在文件中存储由分隔符分隔的大量整数的键值对的最有效方法