Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将64位整数转换为7位字符数组_C++_C_Arrays_Long Integer - Fatal编程技术网

C++ 将64位整数转换为7位字符数组

C++ 将64位整数转换为7位字符数组,c++,c,arrays,long-integer,C++,C,Arrays,Long Integer,假设我有一个函数vector byteVector(long-long-UID),返回UID的字节表示形式,一个64位整数,作为向量。此向量稍后用于将此数据写入文件 现在,因为我决定用Python读取该文件,所以我必须遵守utf-8标准,这意味着我可以。如果最高有效位是1,我就无法再将其解码为字符串,因为它们只支持ASCII字符。此外,我还必须通过命令行接口将这些字符串传递给其他进程,该接口也仅支持ASCII字符集 在这个问题出现之前,我将64位整数拆分为8个独立字节的方法如下,效果非常好: v

假设我有一个函数
vector byteVector(long-long-UID)
,返回UID的字节表示形式,一个64位整数,作为
向量
。此向量稍后用于将此数据写入文件

现在,因为我决定用Python读取该文件,所以我必须遵守utf-8标准,这意味着我可以。如果最高有效位是1,我就无法再将其解码为字符串,因为它们只支持ASCII字符。此外,我还必须通过命令行接口将这些字符串传递给其他进程,该接口也仅支持ASCII字符集

在这个问题出现之前,我将64位整数拆分为8个独立字节的方法如下,效果非常好:

vector<unsigned char> outputVector = vector<unsigned char>();
unsigned char * uidBytes = (unsigned char*) &UID_;
for (int i = 0; i < 8; i++){
    outputVector.push_back(uidBytes[i]);
}
但这似乎有点浪费,因为每个
无符号字符对的第一个只能是0或1,我会浪费一些本来可以使用的空间(6字节)

因为我需要保存64位,并且每个字节可以使用7位,所以我需要64//7+64%7=10个字节

它实际上并不多(我写的文件中没有一个达到1kB),但我以前使用的是8字节,现在使用16字节似乎有点浪费,而10字节(对不起,不是9字节)就足够了。因此:

如何将64位整数转换为10个7位整数的向量?


这可能是太多的优化,但对于这个问题可能有一些非常酷的解决方案(可能使用移位运算符),我真的很想看看

您可以使用位移位来获取64位整数的7位片段。但是,您需要十个7位整数,九个不够:
9*7=63
,短一位

  std::uint64_t uid = 42; // Your 64-bit input here.
  std::vector<std::uint8_t> outputVector;

  for (int i = 0; i < 10; i++)
  {
    outputVector.push_back(uid >> (i * 7) & 0x7f);
  }
std::uint64\u t uid=42;//您的64位输入在这里。
std::向量输出向量;
对于(int i=0;i<10;i++)
{
outputVector.push_-back(uid>>(i*7)&0x7f);
}
在每次迭代中,我们将输入位移位7的倍数,并屏蔽掉一个7位部分。8位数字的最高有效位为零。请注意,向量中的数字是“反向的”:最低有效位具有最低索引。不过,如果您以正确的方式解码这些部分,这是不相关的。解码可按如下方式进行:

std::uint64_t decoded = 0;
for (int i = 0; i < 10; i++)
{
  decoded |= static_cast<std::uint64_t>(outputVector[i]) << (i * 7);
}
std::uint64\u t decoded=0;
对于(int i=0;i<10;i++)
{

decoded |=static_cast(outputVector[i])我建议使用汇编语言

许多汇编语言都有将位转换为“备用”进位并将进位转换为寄存器的指令。C语言没有方便或有效的方法来实现这一点

算法:

for i =  0; i < 7; ++i
{
  right shift 64-bit word into carry.
  right shift carry into character.
}
表示i=0;i<7;++i
{
将64位字右移到进位。
右移进位到字符中。
}

您还应该研究如何使用
std::bitset

base64应该提供11个字节,并且应该有实现它的现有库。也有很多工具可以使用它。我没有得到您想要的。您想要7位元组,但不需要一个字节的8位?通常没有7位变量。如果您满意的话(理论上)未定义的行为,使用并集和位域结构的组合。@DeviceFan问题是,我必须浪费每个字节的第8位,因为UTF-8仅用7位编码文本(字符的字节值不高于127),不使用第8个。不要问我为什么,但我必须遵守标准。我会编辑问题以澄清。UTF-8使用了所有8位,我(也)不明白UTF-8与此有什么关系。如果浪费一点是可以的,而您的解决方案正在运行,您想要什么?问题描述太模糊了。请后退一步,解释您试图实现的目标,并解释原因。给我们一些类似但不同的代码并没有太大帮助。我已经编辑了n我的问题。谢谢你的回答,这正是我想要的!澄清一下:当你说数字颠倒时,你说的是“字节”相反的顺序,对吗?同样,这不能通过反转迭代来解决吗?我的意思是,当你从左到右打印向量时,最低有效位在左字节,最高有效位在右字节。在我们的书写系统中,最高有效位通常在左边,所以在t检测字节是否“反转”。是的,如果您希望将最高有效位放在最低索引处,您可以简单地向后迭代。在这种情况下,有什么比只使用常规按位运算符更好的程序集?请编写代码并查看程序集列表。在程序集的情况下,位偏移是两条指令。编译器生成多少条指令特朗普?
for i =  0; i < 7; ++i
{
  right shift 64-bit word into carry.
  right shift carry into character.
}