我有一个具有以下值的uint8_t state [16][8]
:
86 a9 d2 4e 23 f4 b1 3
b7 2b 8c 69 d1 f1 bb b5
11 7e c3 1 76 4 dc df
6b f0 4f 3d a9 5c 2 68
8 f4 ee 6f 1b e6 90 3b
32 4c 4e 27 99 c b2 4e
f6 9d d5 8d be 84 81 3e
e0 a5 2f 66 31 23 98 75
e4 52 cf 77 42 ad 3 61
40 6b 32 61 2 0 1 0
0 0 fd 60 56 1d c 61
4f cb 22 0 ff ff ff ff
2 0 1 0 e8 98 8 61
fd 6e 22 61 94 60 cf 77
ac a2 d0 77 20 64 2e 61
0 0 0 0 10 cc 22 0
当我做
uint64_t* s = (uint64_t*)state;
然后打印
uint64t* s
,我得到这样的uint64_t
值:4ed2a986
698c2bb7
1c37e11
3d4ff06b
6feef408
274e4c32
8dd59df6
662fa5e0
有人可以向我解释转换的“黑魔法”吗?
更具体地说,我需要将此转换从C函数移植到C#方法。
谢谢
最佳答案
在little-endian机器(例如x86和x64机器)上,整数字节的顺序是从最低有效到最高有效。例如,64位整数
0x1234567890ABCDEF0
在内存中存储如下:
F0 DE BC 9A 78 56 34 12
因此,在小端计算机上,您提供的C代码实际上产生以下数字:
86 a9 d2 4e 23 f4 b1 03 = 0x03b1f4234ed2a986 = 266262285475031430
b7 2b 8c 69 d1 f1 bb b5 = 0xb5bbf1d1698c2bb7 = 13095326223231101879
11 7e c3 01 76 04 dc df = 0xdfdc047601c37e11 = 16130772870216515089
6b f0 4f 3d a9 5c 02 68 = 0x68025ca93d4ff06b = 7494654611845804139
08 f4 ee 6f 1b e6 90 3b = 0x3b90e61b6feef408 = 4292183450400519176
32 4c 4e 27 99 0c b2 4e = 0x4eb20c99274e4c32 = 5670608732741848114
f6 9d d5 8d be 84 81 3e = 0x3e8184be8dd59df6 = 4504027056305446390
e0 a5 2f 66 31 23 98 75 = 0x75982331662fa5e0 = 8473561393972356576
e4 52 cf 77 42 ad 03 61 = 0x6103ad4277cf52e4 = 6990621547598664420
40 6b 32 61 02 00 01 00 = 0x0001000261326b40 = 281485197339456
00 00 fd 60 56 1d 0c 61 = 0x610c1d5660fd0000 = 6992996578231123968
4f cb 22 00 ff ff ff ff = 0xffffffff0022cb4f = 18446744069416864591
02 00 01 00 e8 98 08 61 = 0x610898e800010002 = 6992006543692595202
fd 6e 22 61 94 60 cf 77 = 0x77cf609461226efd = 8633225201093603069
ac a2 d0 77 20 64 2e 61 = 0x612e642077d0a2ac = 7002644561219592876
00 00 00 00 10 cc 22 00 = 0x0022cc1000000000 = 9794518299705344
(您获得了不同的值,因为打印语句中存在错误。)
在同一台计算机上,以下代码产生相同的数字:
ulong value = BitConverter.ToUInt64(data, 0);
提供的C代码或等效的C#代码都不应用于从一台计算机发送到另一台计算机的数据。
关于c# - 指针的黑魔法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41876665/