我一直在努力寻找一种可移植的方法来序列化C和C++中的32位浮点变量,以便发送到微控制器和从微控制器发送.我希望格式足够明确,以便可以从其他语言完成序列化/反序列化,而无需太多努力.相关问题是:
我知道在大多数情况下,类型转换联合/ memcpy可以正常工作,因为浮动表示是相同的,但我宁愿有更多的控制和心灵.到目前为止我想出的是以下内容:
void serialize_float32(uint8_t* buffer, float number, int32_t *index) {
int e = 0;
float sig = frexpf(number, &e);
float sig_abs = fabsf(sig);
uint32_t sig_i = 0;
if (sig_abs >= 0.5) {
sig_i = (uint32_t)((sig_abs - 0.5f) * 2.0f * 8388608.0f);
e += 126;
}
uint32_t res = ((e & 0xFF) << 23) | (sig_i & 0x7FFFFF);
if (sig < 0) {
res |= 1 << 31;
}
buffer[(*index)++] = (res …Run Code Online (Sandbox Code Playgroud) 我正在使用带有内核加密的PowerPC机器.我无法使用内置函数将AES密钥扩展从big endian移植到little endian.大端工作,但小端不工作.
下面的算法是IBM博客文章中提供的代码片段.我想我的问题与以下第2行有关:
typedef __vector unsigned char uint8x16_p8;
uint8x64_p8 r0 = {0};
r3 = vec_perm(r1, r1, r5); /* line 1 */
r6 = vec_sld(r0, r1, 12); /* line 2 */
r3 = vcipherlast(r3, r4); /* line 3 */
r1 = vec_xor(r1, r6); /* line 4 */
r6 = vec_sld(r0, r6, 12); /* line 5 */
r1 = vec_xor(r1, r6); /* line 6 */
r6 = vec_sld(r0, r6, 12); /* line 7 */
r1 = vec_xor(r1, r6); /* …Run Code Online (Sandbox Code Playgroud) 我想从 8 字节类型中提取字节,就像char func(long long number, size_t offset)偏移 n 那样,我将得到第nth 个字节 (0 <= n <= 7)。这样做时,我意识到我不知道 8 字节变量在内存中是如何实际表示的。我希望你能帮我弄清楚。我首先编写了一个简短的 python 脚本来打印A每个字节中由s(ascii 值为 65)组成的数字
sumx = 0
for x in range(8):
sumx += (ord('A')*256**x)
print('x {} sumx {}'.format(x,sumx))
Run Code Online (Sandbox Code Playgroud)
输出是
x 0 sumx 65
x 1 sumx 16705
x 2 sumx 4276545
x 3 sumx 1094795585
x 4 sumx 280267669825
x 5 sumx 71748523475265
x 6 sumx 18367622009667905
x 7 sumx 4702111234474983745
Run Code Online (Sandbox Code Playgroud)
在我看来,每个数字都是一串As 后跟 0。接下来我写了一个简短的 …