c - 将 32 位长分成 4 个字节

标签 c

我知道有很多这样的例子,但没有一个是有效的。 pPtr 是指向这种类型的临时日志的指针

typedef struct
{
  TIMESTAMP_TYPE oTimeStamp;
  ASSERT_ID_TYPE ucAssertID;
  Int16 iData1;
  Int16 iData2;
  UInt16 uiChecksum;
} 
LOG_ENTRY_TYPE;

当我想将日志存储到 EEEPROM 时,我将日志从队列中取出。
o时间戳是类型

typedef struct  
{
  UInt32 ulSecond;  
  UInt16 usMilliSecond;
  UInt16 usPowerCycleCount; 

 } 
  TIMESTAMP_TYPE;

所有其他访问和写入工作,即使是毫秒,但我无法将秒时间戳值分解为 4 个字节。

这是我尝试过的(显然只有一个版本未注释掉):

 UChar tmpByteHigh;
 UChar tmpByteLow;

//Attempt1
tmpByteHigh = (pPtr->oTimeStamp.ulSecond >> 24) & 0x000000FF;
SPIwrite(tmpByteHigh);  
tmpByteLow = (pPtr->oTimeStamp.ulSecond >> 16) & 0x000000FF;
SPIwrite(tmpByteLow);
tmpByteHigh = (pPtr->oTimeStamp.ulSecond >> 8) & 0x000000FF;
SPIwrite(tmpByteHigh);
tmpByteLow = (pPtr->oTimeStamp.ulSecond) & 0x000000FF;
SPIwrite(tmpByteLow);

//Attempt 2
tmpByteHigh = (pPtr->oTimeStamp.ulSecond & 0xFF000000UL) >> 24;
SPIwrite(tmpByteHigh);
tmpByteLow = (pPtr->oTimeStamp.ulSecond & 0x00FF0000UL)  >> 16;
SPIwrite(tmpByteLow);
tmpByteHigh = (pPtr->oTimeStamp.ulSecond & 0x0000FF00UL) >> 8;
SPIwrite(tmpByteHigh);
tmpByteLow = (pPtr->oTimeStamp.ulSecond) & 0x000000FFUL;
SPIwrite(tmpByteLow);


//Attempt 3
//get msw from 32 bit value and write the 2 msB from it
tmpWord = (pPtr->oTimeStamp.ulSecond >> 16) & 0x0000FFFF;
tmpByteHigh = (tmpWord >> 8) & 0x00FF;
SPIwrite(tmpByteHigh);
tmpByteLow = tmpWord & 0x00FF;
SPIwrite(tmpByteLow);
//get lsw from 32 bit value and write the 2 lsB from it
tmpWord = pPtr->oTimeStamp.ulSecond & 0x0000FFFF;
tmpByteHigh = (tmpWord >> 8) & 0x00FF;
SPIwrite(tmpByteHigh);
tmpByteLow = tmpWord & 0x00FF;
SPIwrite(tmpByteLow);


//Attempt 4
UChar* myPointer = (UChar*)&pPtr->oTimeStamp.ulSecond;
UChar myArray[4];
myArray[0]=myPointer[0];
myArray[1]=myPointer[1];
myArray[2]=myPointer[2];
myArray[3]=myPointer[3];
SPIwrite(myArray[0]);
SPIwrite(myArray[1]);
SPIwrite(myArray[2]);
SPIwrite(myArray[3]);

每次我收到通过 SPI 发送的 0x00 0x00 0x00 0x80。有什么想法吗?对我放宽点,我不是一个出色的程序员。

最佳答案

使用 union您可以通过多种方式访问​​相同的数据:

typedef union
{
    struct {
        UInt32 ulSecond;
        UInt16 usMilliSecond;
        UInt16 usPowerCycleCount;
    };
    UInt8 byte[8];
}
TIMESTAMP_TYPE;

int main() {
    TIMESTAMP_TYPE T;
    T.ulSecond = 1;
    T.usMilliSecond = 2;
    T.usPowerCycleCount = 3;
    printf("sizeof(T) = %ld\n", sizeof(T));
    for(int i = 0; i < 8; i++)
        printf("T[%d] = 0x%2.2X\n", i, T.byte[i]);
    return 0;
}

打印:

sizeof(T) = 8
T[0] = 0x01
T[1] = 0x00
T[2] = 0x00
T[3] = 0x00
T[4] = 0x02
T[5] = 0x00
T[6] = 0x03
T[7] = 0x00

注意字节数组有原生的 endianness .如果这不是所需的字节顺序,您将不得不交换字节。

关于c - 将 32 位长分成 4 个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30741037/

相关文章:

python - 从 Python 调用 C 函数

c - 命名管道的大小?进程卡住

c - 为使用 malloc 创建的二维数组赋值

c - epoll_wait() 中的 maxevents 参数和事件数组大小

c++ - 启用和禁用 USB 端口

c - 额外插入 OpenWatcom 内联组装

圆形数组实现

更改进程的父进程

c - 指定文件扩展名

c - 使用指针改变矩阵